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

195

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

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

благодеяние
источник
Ссылка ниже имеет лучший ответ. stackoverflow.com/questions/5361369/…
Ohmy
Кадр против границ с картинками: stackoverflow.com/a/28917673/3681880
Сурагч,

Ответы:

241

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

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

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

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

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

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

Барни Мэттокс
источник
33
Я думаю, что стоит добавить, что boundsони обычно используются, когда к представлению применяется преобразование. При этих обстоятельствах frameсобственность не определена. Как указано в других ответах, изменение centerи boundsэквивалентно изменению позиции и размера представления соответственно.
Стюарт
36

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

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

frame.origin = center - bounds.size / 2

(что так же, как)

center = frame.origin + bounds.size / 2

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

frame.size = bounds.size

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

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

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

Тайлер
источник
18

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

Марко Мустапик
источник