Рамка UIView, границы, центр, начало координат, когда использовать что?


UIView свойства frame,bounds,center и origin, и они все взаимосвязаны. Большую часть времени я имею дело с frame при установке положения и размера a UIView. Я понимаю, что frame использует глобальную систему координат и bounds использует координату локального представления (поэтому его x и y равны 0, но не всегда), но это все еще сбивает меня с толку, когда использовать что.

в каком контексте (и в какое время) другой свойства (bounds,center,origin) следует использовать?

3 192

3 ответа:

ответ Марко выше правильный, но просто чтобы расширить вопрос "в каком контексте"...

рама - это свойство, которое вы чаще всего используете для обычных приложений iPhone. большинство элементов управления будут выложены относительно" содержащего " элемента управления, поэтому кадр.начало координат будет непосредственно соответствовать тому, где должен отображаться элемент управления, и кадр.размер будет определять, насколько большой, чтобы сделать контроль.

центр - это свойство вы скорее всего, сосредоточится на Играх и анимациях на основе спрайтов, где может произойти движение или масштабирование. По умолчанию анимация и вращение будут основаны на центре UIView. Редко имеет смысл пытаться управлять такими объектами с помощью свойства frame.

границы - это свойство не является свойством позиционирования, но определяет область рисования UIView "относительно" кадра. По умолчанию это свойство обычно (0, 0, ширина, высота). Изменение этого свойства позволит вам рисовать вне рамки или ограничить рисование меньшей площадью внутри рамки. Хорошее обсуждение этого можно найти по ссылке ниже. Это свойство редко используется, если нет особой необходимости в настройке области чертежа. Единственным исключением является то, что большинство программ будут использовать [[UIScreen mainScreen] bounds] при запуске, чтобы определить видимую область для приложения и настроить их начальный фрейм UIView соответственно.

почему в UIView есть прямоугольник рамки и прямоугольник границ?

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

они являются связанными значениями и поддерживаются в соответствии с методами установки/получения свойств (и с использованием того факта, что frame является чисто синтезированным значением, не подкрепленным фактической переменной экземпляра).

основными уравнениями являются:

frame.origin = center - bounds.size / 2

(что то же самое, что и)

center = frame.origin + bounds.size / 2

(и там же)

frame.size = bounds.size

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

этот материал все объясняется более подробно с полезной мини-библиотекой здесь:

http://bynomial.com/blog/?p=24

свойства center,bounds и frame взаимосвязаны: изменение одного будет обновлять другие, так что используйте их как хотите. Например, вместо изменения параметров x/y frame чтобы повторно центрировать представление, просто обновите center собственность.