Когда ограничения автоопределения устанавливают кадры во время жизненного цикла контроллера?

Я использовал ограничения автоопределения из раскадровки. Однако в некоторых случаях я хочу рассчитать динамическую высоту subview. Я кодирую это в viewDidAppear (), он отлично работает, потому что этот метод вызывается после того, как все кадры представления заданы ограничениями макета. Проблема здесь в том, что я вижу рамку, заданную ограничениями на полсекунды. И тогда код перерисовывает представление.

Я узнал о viewDidLayout (), который вызывается после того, как ограничения задали фрейм, чтобы я мог измениться. Но это не сработает. Это похоже на то, что этот метод вызывается до того, как используются ограничения.

3 Solutions collect form web for “Когда ограничения автоопределения устанавливают кадры во время жизненного цикла контроллера?”

Метод viewDidAppear вызывается в конце жизненного цикла представления. Поэтому, если вы измените ограничения здесь, это будет всегда видно.

Если изменение, которое вы хотите сделать, является одноразовым событием, вы можете сделать это в методе viewWillAppear . Но это не всегда поможет, потому что к этому времени чертеж не может быть завершен. Таким образом, лучший вариант – поместить код в viewWillLayoutSubviews или viewDidLayoutSubviews .

ПРИМЕЧАНИЕ. viewWillLayoutSubviews или viewDidLayoutSubviews будут вызываться несколько раз в жизненном цикле просмотра, например, изменение ориентации или перемещение в другое или другое изображение или любое изменение кадра в этом случае.
Если изменение кода, которое вы хотите разместить здесь, является одноразовым событием, тогда обязательно используйте флаги.

например:-

 - (void)viewWillLayoutSubviews { if(firstTime) { // put your constraint change code here. } } 

Надеюсь это поможет! 🙂

Как следует из названия, viewDidLayoutSubviews вызывается, когда представление вашего viewController только что завершило его выкладку, и вы можете предположить, что на этой динамической высоте ваши представления находятся в их правильных местах / кадрах в соответствии с вашими ограничениями автоопределения.

 Swift : override func viewDidLayoutSubviews() { // Set your constraint here } Objective C : -(void)viewDidLayoutSubviews { // Set your constraint here } 

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

  // Called to notify the view controller that its view has just laid out its subviews override func viewDidLayoutSubviews() { //Write your code here, any constraint modification etc. super.viewDidLayoutSubviews() } 
  • Пользовательская ячейка просмотра таблицы с быстрым в xcode 6
  • Xcode, не может найти мой класс, который я создал
  • iOS 8 Today Extension не работает на устройстве
  • UIButton имеет точку, когда она выбрана внутри UIToolbar
  • Сдвиг фрейма iPhone 6+
  • Xcode 7: Shadow НЕ показывает вокруг UIView в интерфейсе Builder
  • Домен Alamofire = NSPOSIXErrorDomain Код = 2 возникает после обновления El Capitan с Xcode 7.0.1
  • Кнопка «Назад» не отображается в навигационном контроллере
  • AudioSessionSetProperty устарел в iOS 7.0, поэтому как установить kAudioSessionProperty_OverrideCategoryMixWithOthers
  • iOS UINavigationBar против UIToolbar против UITabBar
  • Ограничение UIWebview на определенные страницы
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.