2015-04-16 3 views
3

У меня возникли проблемы с выяснением, когда установка auto-contraints на XIB применяется в процессе установки вида.Objective-C/Swift (iOS) Когда автоматические ограничения применяются в потоке View/ViewController?

Для более подробного объяснения:

  • я установки XIB для представления
  • Я установил «Симуляция Метрики» Размер для iPhone 3,5-дюймовый
  • Я добавил автоматические ограничения на на подвиды внутри этой точки зрения
  • в View Controller я выполнить определенные операции, зависящие от подвида (IBOutlet) frames/bounds в методе viewDidLoad
  • В представлении я выполнить определенные операции, зависящие от подвид (IBOutlet) frames/bounds в awakeFromNib методом

В этих 2 методов (ViewController::viewDidLoad and View::awakeFromNib) мнения IBOutlet были загружены, но не ограничения, которые еще не были применены. Фактический кадр по-прежнему установлен на размер iPhone 3.5 "(ширина 320) при использовании более крупного симулятора (например, симулятора iPhone 6).

Когда применяются эти автоматические ограничения и когда должны выполняться какие-либо необходимые операции фактический кадр/пределы подвидов имеют место?

Я использую XCode 6.3, Swift (1,2)

ответ

8

ограничения применяются в методе layoutSubviews. Так что, если вы хотите сделать что-то после того, как они применяются в подклассе UIView, переопределить метод:

override func layoutSubviews() { 
    super.layoutSubviews() 
    //the frames have now their final values, after applying constraints 
    } 

В UIViewController подклассе используйте viewDidLayoutSubviews для тех же целей:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    //the frames have now their final values, after applying constraints 
    } 

Пожалуйста, обратите внимание, что вы не должны установить frame/bounds для обзора, если вы добавили ограничение Автокомпоновки к этой точке зрения.

+0

Perfect. Благодаря! – pkearney06

+1

не работает иногда –

+0

При работе с пользовательским подклассом UITableViewCell это само по себе не обновляло фреймы сразу; только прокручивая камеру и снова заставляя ее выкладываться. Добавление 'setNeedsLayout(); layoutIfNeeded' в конце моего переопределения 'updateConstraints', похоже, исправил его. Удивительно, но замена 'layoutIfNeeded' на' layout' не сработала, даже после 'setNeedsLayout'. –

0

Примечание для Xcode 8: Если вы используете автоматическую компоновку, у вас может возникнуть проблема с новой функцией: посмотреть как [любое устройство]. Когда вы тестируете свое приложение на другом устройстве (симуляторе) и получаете isdred screen, скрыть границы для этого устройства, будет применяться в viewWillLayoutSubviews.