Я хотел бы знать, как правильно использовать эти свойства.
Как я понимаю, frame
можно использовать из контейнера представление, которое я создаю. Он устанавливает позицию просмотра относительно контейнера. Он также устанавливает размер этого представления.
Также center
может использоваться из контейнера созданного мной представления. Это свойство изменяет положение представления относительно его контейнера.
Наконец, bounds
относительно самого взгляда. Это изменяет область рисования для вида.
Можете ли вы дать больше информации об отношениях между frame
и bounds
? А как насчет clipsToBounds
и masksToBounds
свойства?
Ответы:
Поскольку вопрос, который я задавал, встречался много раз, я приведу подробный ответ на него. Не стесняйтесь изменять его, если вы хотите добавить более правильный контент.
Сначала краткий обзор вопроса: рамка, границы, центр и их отношения.
Кадр Представление
frame
(CGRect
) - это положение его прямоугольника вsuperview
координат России. По умолчанию он начинается слева вверху.Границы вида
bounds
(CGRect
) выражает прямоугольник представления в своей собственной системе координат.Центр
center
являетсяCGPoint
выраженным в терминахsuperview
системы «s координат и определяет положение точной центральной точки зрения.Взятые из UIView + position это отношения (они не работают в коде, поскольку они являются неформальными уравнениями) среди предыдущих свойств:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
ПРИМЕЧАНИЕ. Эти отношения не применяются, если представления повернуты. Для получения дополнительной информации, я предлагаю вам взглянуть на следующее изображение, взятое из кухонного ящика на основе курса Stanford CS193p . Кредиты идут в @Rhubarb .
Использование
frame
позволяет изменить положение и / или изменить размер представления в пределах егоsuperview
. Обычно его можно использоватьsuperview
, например, при создании определенного подпредставления. Например:Когда вам нужны координаты для рисования внутри,
view
вы обычно ссылаетесьbounds
. Типичным примером может быть рисование внутриview
подпредставления как вставка первого. Составление подпредставления требует знанияbounds
суперпредставления. Например:Различное поведение происходит, когда вы меняете
bounds
представление. Например, если вы изменитеbounds
size
,frame
изменения (и наоборот). Изменение происходит поcenter
всему виду. Используйте код ниже и посмотрите, что произойдет:Кроме того, если вы измените,
bounds
origin
вы изменитеorigin
его внутреннюю систему координат. По умолчаниюorigin
это в(0.0, 0.0)
(верхний левый угол). Например, если вы измените «origin
for»,view1
вы увидите (прокомментируйте предыдущий код, если хотите), что теперь левый верхний уголview2
касаетсяview1
. Мотивация довольно проста. Вы говорите ,view1
что его верхний левый угол в настоящее время находится в положении ,(20.0, 20.0)
но так какview2
«Sframe
origin
начинается с(20.0, 20.0)
, они будут совпадать.origin
Представляетview
позицию «S в пределах его ,superview
но описывает положениеbounds
центра.Наконец,
bounds
иorigin
не связанные понятия. Оба позволяют получитьframe
вид (см. Предыдущие уравнения).Пример использования View1
Вот что происходит при использовании следующего фрагмента.
Относительное изображение.
Это вместо того, что произойдет, если я изменю
[self view]
границы следующим образом.Относительное изображение.
Здесь вы говорите,
[self view]
что его левый верхний угол теперь находится в позиции (30.0, 20.0), но посколькуview1
начало кадра начинается с (30.0, 20.0), они будут совпадать.Дополнительные ссылки (для обновления другими ссылками, если хотите)
О
clipsToBounds
(источник Apple Doc)Другими словами, если представление
frame
есть(0, 0, 100, 100)
и его подпредставление есть(90, 90, 30, 30)
, вы увидите только часть этого подпредставления. Последнее не будет выходить за пределы родительского представления.masksToBounds
эквивалентноclipsToBounds
. Вместо этогоUIView
это свойство применяется кCALayer
. Под капотомclipsToBounds
звонитmasksToBounds
. Для дальнейших ссылок взгляните на Какова связь между clipsToBounds UIView и masksToBounds CALayer? ,источник
На этот вопрос уже есть хороший ответ, но я хочу дополнить его еще несколькими картинками. Мой полный ответ здесь.
Чтобы помочь мне вспомнить рамку , я думаю о картинной рамке на стене . Точно так же, как изображение может быть перемещено в любое место на стене, система координат рамки вида является суперпредставлением. (стена = супер-вид, рамка = вид)
Чтобы помочь мне вспомнить границы , я думаю о границах баскетбольной площадки . Баскетбол находится где-то внутри корта, точно так же, как система координат границ вида находится внутри самого представления. (корт = вид, баскетбол / игроки = контент внутри вида)
Как и кадр, view.center также находится в координатах суперпредставления.
Кадр против границ - Пример 1
Желтый прямоугольник представляет рамку вида. Зеленый прямоугольник представляет границы представления. Красная точка на обоих изображениях представляет происхождение рамки или границ в их системах координат.
Пример 2
Пример 3
Пример 4
Это то же самое, что и в примере 2, за исключением того, что на этот раз все содержимое представления отображается так, как если бы оно не было обрезано до границ представления.
Пример 5
Опять же, смотрите здесь мой ответ с более подробной информацией.
источник
Я нашел это изображение наиболее полезным для понимания рамки, границ и т. Д.
Также обратите внимание, что
frame.size != bounds.size
при повороте изображения.источник
Я думаю, если вы думаете, с точки зрения
CALayer
, все более ясно.Фрейм - это вообще не отдельное свойство вида или слоя, это виртуальное свойство, вычисляемое из границ, положения (
UIView
центра) и преобразования.Таким образом, в основном, как макеты слоя / вида действительно определяются этими тремя свойствами (и anchorPoint), и любое из этих трех свойств не изменит любое другое свойство, как изменение преобразования не меняет границ.
источник
На этот пост есть очень хорошие ответы с подробным объяснением. Я просто хотел бы сослаться на то, что есть другое объяснение с визуальным представлением значения Frame, Bounds, Center, Transform, Bounds Origin в видео WWDC 2011 Понимание рендеринга UIKit, начиная с @ 4: 22 до 20:10
источник
Прочитав приведенные выше ответы, сюда добавляю мои интерпретации.
Предположим, что вы просматриваете онлайн, веб-браузер - это ваш сайт,
frame
который решает, где и насколько велик показ веб-страницы. Скроллер браузера - это ваш,bounds.origin
который решает, какая часть веб-страницы будет показана.bounds.origin
трудно понять. Лучший способ научиться - создавать приложение Single View Application, пытаясь изменить эти параметры и посмотреть, как меняются подпредставления.источник