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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

frame.origin = center - bounds.size / 2

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

center = frame.origin + bounds.size / 2

(и theres также)

frame.size = bounds.size

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

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

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

Ответ 3

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