2009-07-01 5 views
191

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

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

+0

Ссылка ниже имеет лучший ответ. http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center – Ohmy

+0

Рамка с изображениями: http://stackoverflow.com/a/28917673/3681880 – Suragch

ответ

235

ответа Марко выше правильно, но только расширить на вопрос «под каким контекстом» ...

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

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

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

Why is there an frame rectangle and an bounds rectangle in an UIView?

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

+31

Я думаю, что стоит добавить, что 'bounds' обычно используются, когда к представлению применяется преобразование. В этих условиях свойство 'frame' не определено. Как указывалось в других ответах, изменение «центра» и «границ» эквивалентно изменению позиции и размера представления соответственно. – Stuart

17

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

35

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

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

frame.origin = center - bounds.size/2 

(который так же, как)

center = frame.origin + bounds.size/2 

(и есть также)

frame.size = bounds.size 

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

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

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