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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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 заблокированы: изменение одного обновит остальные, поэтому используйте их так, как вы хотите. Например, вместо изменения параметров х / у frame чтобы изменить представление, просто обновите center имущество.

Другие вопросы по тегам