20

Вопрос по uiview, cocoa, xcode, ios – Как установить ссылку на источник UIView?

Я создаю UIImageView и добавляю его в цикле к своему виду, я устанавливаю начальный кадр на 0,0,1,47, и при каждом прохождении цикла я меняю центр изображения, чтобы разметить их.

Я всегда использую 0 в качестве origin.y

Проблема в том, что исходная ссылка находится в центре изображения, если предположить, что мы работали в конструкторе интерфейсов, это эквивалентно изображению ниже.

Как я могу изменить контрольную точку в коде?

enter image description here

  • Привет, проблема в том, что исходная точка установлена в абсолютном центре этого представления, мне нужно изменить его на верхний левый.

    от Daniel
  • Как я объяснил выше, вам просто нужно установить x и y вида изображения на 0, 0. Это поместит его на 0, 0 его родительского вида.

    от
  • Я был очень смущен, когда я спросил это. Короче говоря, с помощью функции Xcode IB вы можете установить метрики UIView с помощью полезной панели, задать значения пикселей, но вы также можете изменить точку отсчета от центра к верхнему среднему, верхнему правому, нижнему левому и т.д. ... и это заставило меня подумать, что я мог бы сделать это как-то в коде, но это было просто полезным интерфейсом, если не запутанным дополнением к Xcode Apple ...

    от Daniel
  • Что мне действительно нужно, так это установить происхождение моего вида в известную точку, не беспокоясь о размере вида.

    от Daniel
  • Я помню, что весь смысл заключался в том, чтобы проще и быстрее выровнять подпредставление вправо, установив начало координат по центру вправо, а затем присвоив значению ширину его родителя. Это означает, что нужно обойтись без математики, вычисляющей ширину минус дочерняя ширина и т. Д. И т. Д.

    от Daniel
  • У вас такая же проблема? Это потому, что построитель интерфейса Xcode проще визуально компоновать вещи. На самом деле происхождение является центром ...

    от Daniel
  • Когда вы говорите происхождение, о каком происхождении вы говорите? Смещение origin.y фрейма - это положение его вершины в суперпредставлении. Существует "центр" Свойство для вида, но я дон & APOS; т знать о любой подвижной опорной точке в пределах вида.

    от
  • Вы можете легко создать cetagory наUIView с такими свойствами, какframeBorderLeft или жеframeOrigin и реализовать эти средства доступа вручную. Тогда тебе легче.

    от
  • anchorPoint - чистая магия, большое спасибо за это! У меня была немного другая проблема, я масштабировал представления, которые закреплены внизу. Свойство anchorPoint сделало это полностью без проблем - удалили около 20 строк кода ...

    от
  • Происхождение, вероятно, не лучшее слово для описания того, что я имею в виду, вы видите, что в IB вы можете изменить исходную точку отсчета сверху слева, сказать центр или нижнюю середину или центр справа ... см. Изображение, которое я прикрепил. Ну, я добавил представление в коде, и я хотел установить начало координат (координаты) в верхней части родительского представления, так что у меня будет y = 0. Однако кажется, что исходная точка моего обзора установлена не в верхнем левом углу, как кажется по умолчанию, а в центре (см. Изображение). Поэтому, когда я устанавливаю y = 0, вид только показывает его нижнюю половину, поскольку центр этого вида установлен на y = 0.

    от Daniel
  • Привет, вопрос не столько в том, как изменить рамку, сколько в том, как изменить исходную точку. В настоящее время установка y = 0 означает, что центр обзора установлен на y = 0, а не на верх

    от Daniel
  • Спасибо jmstone. Это помогло в моем случае.

    от
  • @ Даниил, вы отметили это как решенное? Я не думаю, что это отвечает на ваш вопрос. Вы уже нашли решение?

    от
  • Вы не можете просто переместить эту красную вещь в IB?

    от Christian Schnorr
  • Да но дело былоHow can I change the reference point in code ?

    от Daniel
  • 8

    Кадр объекта включает его положение в его суперпредставление. Вы может

    е изменить это следующим образом:

    CGRect frame = self.imageView.frame;
    frame.origin.y = 0.0f;
    self.imageView.frame = frame;
    

  • 2

    Если я вас правильно понимаю

    вам нужно установить кадр изображения, которое вы хотите переместить. Это можно сделать в простом случае, как это:

    _theImageView.frame = CGRectMake(x, y, width, height);
    

    Очевидно, вам нужно установить x, y, width и height самостоятельно. Также следует иметь в виду, что фрейм представления относится к его родительскому представлению. Итак, если у вас есть вид, который находится в верхнем левом углу (x = 0, y = 0), имеет ширину 320 точек и высоту 400 точек, и вы устанавливаете рамку вида изображения как (10, 50, 100, 50), а затем добавьте его в качестве подпредставления предыдущего представления, оно будет находиться в точке x = 10, y = 50 координатного пространства родительского представления, даже если границы представления изображения равны x = 0, y = 0. Границы относятся к самому представлению, рамка - к родительскому.

    Итак, в вашем сценарии ваш код может выглядеть примерно так:

    CGRect currentFrame = _theImageView.frame;
    currentFrame.origin.x = 0;
    currentFrame.origin.y = 0;
    _theImageView.frame = currentFrame;
    
    [_parentView addSubview:_theImageView];
    

    В качестве альтернативы вы можете сказать:

    CGRect currentFrame = _theImageView.frame;
    _theImageView.frame = CGRectMake(0, 0, currentFrame.size.width, currentFrame.size.height);
    
    [_parentView addSubview:_theImageView];
    

    Любой подход установит представление изображения в верхнем левом углу родительского элемента, к которому вы добавляете его.

  • 44

    Прочитав эти ответы и ваши комментарии

    я не совсем уверен, в чем ваша точка зрения.

    СUIView Вы можете установить положение двумя способами:

    center – It definitely says it is the center. frame.origin – Top left corner, can't be set directly.

    Если вы хотите, чтобы нижний левый угол был при x = 300, y = 300, вы можете просто сделать это:

    UIView *view = ...
    CGRect frame = view.frame;
    frame.origin.x = 300 - frame.size.width;
    frame.origin.y = 300 - frame.size.height;
    view.frame = frame;
    

    Но если вы идете на один уровень глубже в волшебный мирCALayers (не забывайте импортировать QuartzCore), вы сильнее.

    CALayer имеет эти:

    position – You see, it don't explicitely says 'center', so it may not be center! anchorPointCGPoint with values in range 0..1 (including) that specifies point inside the view. Default is x=0.5, y=0.5 which means 'center' (and -[UIView center] assumes this value). You may set it to any other value and the position property will be applied to that point.

    Пример времени:

    You have a view with size 100x100 view.layer.anchorPoint = CGPointMake(1, 1); view.layer.position = CGPointMake(300, 300); Top left corner of the view is at x=200, y=200 and its bottom right corner is at x=300, y=300.

    Note: Когда вы вращаете слой / вид, он будет вращаться вокругanchorPointэто центр по умолчанию.

    Бу, так как вы просто спроситеHOW делать конкретную вещь, а неWHAT ты хочешь достичь, я больше не могу тебе помочь.