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

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

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

3 ответов


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

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

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

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

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

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


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

основные уравнения:

frame.origin = center - bounds.size / 2

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

center = frame.origin + bounds.size / 2

(и там же)

frame.size = bounds.size

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

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

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


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