Как заставить макет Subviews of UIView. - PullRequest
49 голосов
/ 27 сентября 2011

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

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

 - (void)viewWillAppear:(BOOL)animated

И все работает как положено.

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

Я размещаю эти подпредставления в:

- (void)layoutSubviews

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

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

 - (void)layoutIfNeeded

А также:

 - (void)setNeedsLayout

В viewWillAppear, но, похоже, это ничего не меняет.

Есть идеи, что я делаю не так?

Спасибо.

Ответы [ 4 ]

91 голосов
/ 28 февраля 2013

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

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

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

5 голосов
/ 28 сентября 2011

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

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

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

Когда за пределами экрана ориентация все еще должна быть повернута, поэтому ваши взгляды должны быть правильно расположены при повторном переходе на экран.

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

4 голосов
/ 23 ноября 2016

При быстром 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    //Doesn`t neeed to call super to work
    view.setNeedsLayout()
}

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

0 голосов
/ 28 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...