Подтвердить что ты не робот

Как заставить layoutSubviews UIView.

У меня есть пользовательский UIView, у которого есть выделенный, ручной набор кадров для портретной и альбомной ориентации, потому что autoresizingMasks просто не работает в моем случае.

Я устанавливаю этот кадр в:

 - (void)viewWillAppear:(BOOL)animated

И он работает как ожидалось.

Теперь моя проблема заключается в том, что мой UIView также имеет подзаголовки, которые также имеют выделенную позицию для портрета/пейзажа.

Я помещаю эти подпрограммы в:

- (void)layoutSubviews

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

Я ничего не делаю в viewDidAppear, и я уже пробовал звонить

 - (void)layoutIfNeeded

Также как:

 - (void)setNeedsLayout

В viewWillAppear, но он ничего не меняет.

Любые идеи, что я делаю неправильно?

Спасибо.

4b9b3361

Ответ 1

Сегодня была аналогичная проблема. Я решил это, сначала позвонив

  • -setNeedsLayout: установите флаг, который соответствует макету представления, и затем вызывая
  • -layoutIfNeeded: Немедленно проверьте флаг и - как он был установлен вручную до - в результате вызывается макет layoutSubviews.

Не знаю, лучший ли это, но он работает;)

Ответ 2

Я бы предложил установить начальный кадр в viewDidLoad, а затем изменить рамку представления для изменений ориентации в

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Вам не нужны какие-либо явные анимации в layoutSubviews (не уверены, были ли у вас есть, но это звучало как это), поскольку любые изменения кадра будут синхронизированы с анимацией вращения.

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

Я также рекомендую смотреть WWDC 2010 Session 123 "Создание анимационного управляемого интерфейса", который более подробно описывает этот материал.

Ответ 3

Свифт 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}

работает отлично

Ответ 4

Для меня работает [self.view setNeedsDisplay]. Это вызывает перерисовку на весь вид. Вы также можете перерисовать выбранный вид, вызвав setNeedsDisplay на конкретном представлении, которое я сделал в моем случае, и он отлично работал.