Когда использовать layoutSubview в iOS

Я пишу приложение iOS для iPad, для которого требуется индивидуальный макет.

Макет из портрета и пейзажа полностью разный, поэтому его нельзя решить, используя UIAutoResizingMask.

Я пытаюсь использовать метод layoutSubview, но я обнаружил, что макет subview называется много (из UIScrollView). Как я могу уменьшить вызов layoutSubview, чтобы оптимизировать код, или я должен называть его сам, когда когда-либо будет повернуто устройство.

Спасибо.

Тот факт, что layoutSubviews дочерним UIScrollView , очень неудачный, но есть (уродливое) обходное решение:

 @interface MyClass : UIView { BOOL reallyNeedsLayout_; } @end @implementation MyClass - (void)setNeedsLayout { [super setNeedLayout]; reallyNeedsLayout_ = YES; } - (void)setFrame:(CGRect)rect { [super setFrame:rect]; reallyNeedsLayout_ = YES; } - (void)layoutSubviews { if (!reallyNeedsLayout_) return; reallyNeedsLayout_ = NO; // Do layouting. } @end 

Не лучшее решение, но, похоже, работает достаточно хорошо.

Для разных ландшафтных и портретных дизайнов используйте методы контроллера вида, такие как

 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 

Если вы создадите свое собственное представление в зависимости от текущей ориентации, проверьте эту ориентацию по уведомлению UIDeviceOrientationDidChangeNotification и напишите соответствующий код.

в одном из методов init~ :

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangedOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

И действие

 - (void) didChangedOrientation:(NSNotification *)sender{ UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; if (UIDeviceOrientationIsPortrait(orientation)){}} 

Вы не должны делать дорогие вычисления в layoutSubviews:

Говоря по собственному опыту, я бы лично только отрегулировал ваш макет на основе уведомлений deviceDidRotateSelector. У меня есть метод updatePortrait и метод updateLandscape и вызов, который вам нужен.

  • FMDB lastinsertRowID всегда 0
  • Одно приложение для Facebook, связанное с несколькими приложениями для iOS
  • CALayer должен распространяться на все подслои?
  • Проблема с ключевым текстом QuartzCore в ios
  • Как загружать изображения с помощью AFNetworking непосредственно из приложения iPad
  • Как получить правильную версию iOS программно?
  • Можно ли использовать AutoLayout с таблицей TableHeaderView UITableView?
  • iOS: поддерживайте приложение как службу
  • Тема убивает ОС
  • Отключение многозадачного распознавателя жестов iOS во время игры
  • iOS 8 запускает приложение навсегда или отключает экран
  • Давайте будем гением компьютера.