2015-04-26 5 views
2

В одном из видео WWDC Apple заявила, что макет выполняется сверху вниз, то есть от супервизора до субвью (после того, как ограничения вычисляются снизу вверх). Дисплей также выполняется сверху вниз.iOS Auto Layout UIView Цикл рисования

Мои вопросы: 1. В какой точке viewController определяется рама представления (происхождение и размер)? Я попытался зарегистрировать размер представления (определяемый с помощью автоматического макета), но он всегда 0 0 0 0, что является нечетным, поскольку представление уже сгенерировано в симуляторе;

Для авторизованного просмотра, когда доступен view.frame?

  1. Тот же вопрос, кроме этого времени UIImageView.frame. Я попытался войти в консоль, хотя размер вписывается в ограничения, зарегистрированный кадр UIImageView равен 0 0 width_of_original_image height_of_original_image. Но для других видов, таких как метки, кадр корректно печатается на консоли.

Кажется, что существует таинственный механизм автоматической компоновки, который выполняет преобразование, и никто не знает, что происходит внутри движка, но чтобы проверить, что бросается на экран симулятора, чтобы выяснить, как визуализировалось представление этим движком ???

ответ

6

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

Так что если вы проверили размеры вещей до времени макета, вы получите неправильный ответ, потому что этого еще не произошло.

И когда является Время макета? Это когда время выполнения отправляет представления layoutSubviews - на самом деле, среда выполнения подчиняется ограничениям и выполняет макет во времяlayoutSubviews. И ваш контроллер просмотра может услышать об этом до или после, с viewWillLayoutSubviews и viewDidLayoutSubviews.

Я думаю, что часть, которая смущает новичков больше всего, происходит, когда появляется контроллер представления. viewDidLoad означает, что имеет вид, но это все; ни вид, ни его подпрограммы еще не находятся в интерфейсе, поэтому, очевидно, не может быть макета. Значительно позже, мы получаем viewWillAppear:, вид переходит в интерфейс, и сейчас мы получаем макет. Поэтому, если вы проверите размеры, скажем, viewDidAppear:, они будут правы.

+0

И посмотрите мою книгу: http://www.apeth.com/iOSBook/ch14.html#_order_of_layout_events и http://www.apeth.com/iOSBook/ch19.html#_view_controller_lifetime_events – matt

+0

Являются ли они такими же: атрибут : NSLayoutAttributeCenterX relatedBy: 0 toItem: атрибут self.view: NSLayoutAttributeLeft мультипликатора: 1 константа: self.otherView.center.x]] по сравнению с атрибутом: NSLayoutAttributeCenterX relatedBy: NSLayoutRelationEqual toItem: автономный атрибут : NSLayoutAttributeCenterX умножитель: 1.0 константа: 0,0]]; – NSCoder

Смежные вопросы