Как заставить layoutSubviews UIView.
У меня есть пользовательский UIView, у которого есть выделенный, ручной набор кадров для портретной и альбомной ориентации, потому что autoresizingMasks просто не работает в моем случае.
Я устанавливаю этот кадр в:
- (void)viewWillAppear:(BOOL)animated
И он работает как ожидалось.
Теперь моя проблема заключается в том, что мой UIView также имеет подзаголовки, которые также имеют выделенную позицию для портрета/пейзажа.
Я помещаю эти подпрограммы в:
- (void)layoutSubviews
Если теперь я оставил свой viewController в портретной ориентации , например, поверните на пейзаж на другой viewController, а затем вернитесь к этому viewController. Я вижу, что мое представление было правильно изменено, но в подзаголовках моего представления, которые позиционируются в layoutSubviews, пока не перегруппированы, но изменены анимированным способом после того, как представление уже появилось.
Я ничего не делаю в viewDidAppear, и я уже пробовал звонить
- (void)layoutIfNeeded
Также как:
- (void)setNeedsLayout
В viewWillAppear, но он ничего не меняет.
Любые идеи, что я делаю неправильно?
Спасибо.
Ответы
Ответ 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
на конкретном представлении, которое я сделал в моем случае, и он отлично работал.