2015-11-06 3 views
2

Приложение, которое у меня работало на iOS 7 и 8, имело некоторые незначительные проблемы на iOS9, одним из которых является то, что один контроллер просмотра получает неправильную высоту.UIViewController неправильной высоты при начальной загрузке

Следующий код:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self layoutViews]; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [self layoutViews]; 
} 

- (void)layoutViews { 
    NSLog(@"Size-> %@", NSStringFromCGRect(self.view.frame)); 
} 

Производит следующий ошибочный вывод:

2015-11-06 22:42:31.737 app[62442:1136052] Size-> {{0, 0}, {375, 667}} 
2015-11-06 22:42:33.318 app[62442:1136052] Size-> {{0, 32}, {667, 343}} 
2015-11-06 22:42:34.885 app[62442:1136052] Size-> {{0, 64}, {375, 603}} 
2015-11-06 22:45:18.063 app[62442:1136052] Size-> {{0, 32}, {667, 343}} 

Когда я:

  1. Открыть VC в портретном
  2. Поворот на альбомную
  3. Поворот назад к портрету
  4. Повернуть обратно в пейзаж

кажется, что начальная нагрузка VC обеспечивает неправильный размер под self.frame.size, а все последующие повороты правильно. Высота 603 верна, но вы можете видеть, что при двух поворотах к пейзажу это все еще неверно на 667.

Я думал, что что-то связанное с панелью контроллера навигатора может сломать его. Мой код в методе viewDidLoad просто:

- (void)viewDidLoad { 
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { 
     [self setEdgesForExtendedLayout:UIRectEdgeNone]; 
    } 

    [super viewDidLoad]; 
} 

Который работает отлично на прошивке 8.

Update Исправлен, добавив вызов viewDidAppear:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self layoutViews]; 
    [activitiesTable flashScrollIndicators]; 
} 
+0

ли вы в строке состояния включены? –

+0

Да, у меня всегда есть строка состояния. –

ответ

0

Ваш код правильный и его работа прекрасна после первой загрузки.

Так что вопрос с первой загрузкой.

Apple Document for Auto layout дает ответ.

Вам просто нужно написать свой код в методе viewDidAppear:.

Так написать код из viewDidLoad: метода

-(void)viewDidAppear:(BOOL)animated{ 
[super viewDidAppear:animated]; } 
+0

Я даже пробовал это. Я вызвал setEdgesForExtendedLayout в загрузке и появился, это дало мне тот же результат !!!! –

+0

Это сработало, я пренебрег методом 'viewDidAppear'. В iOS9 необходимо было дополнительно запустить собственный метод 'layoutViews' в' viewDidAppear'. Это показывает явное различие в поведении в iOS9, но эй .. мы привыкли к этому;) –

0

Я не что вы добавляете setEdgesForExtendedLayout в viewDidLoad. Я пробовал свой путь

с UIRectEdgeNone:

2015-11-06 19:40:41.881 Test[934:275179] Size-> {{0, 64}, {375, 603}} 

У меня есть панель навигации на мой взгляд контроллера.

с UIRectEdgeTop & & UIRectEdgeAll:

2015-11-06 19:52:18.086 Test[1113:331687] Size-> {{0, 0}, {375, 667}} 

с UIRectEdgeLeft & & UIRectEdgeBottom & & UIrectEdgeRight & & UIRectEdgeNone:

2015-11-06 19:54:43.864 Test[1137:343893] Size-> {{0, 64}, {375, 603}} 

Как указано в документации:

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

wantsFullScreenLayout свойство вида контроллера является устаревшим в IOS 7. Если вы в настоящее время указать wantsFullScreenLayout = НЕТ, контроллер вида может отображать его содержимое в неожиданном месте экрана , когда он работает в прошивке 7.

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

Если вы посмотрите на вид Debugger под случаях UIRectEdgeAll против UIRectEdgeNone

Если вы используете UIRectEdgeAll, использование Вид на контроллер полный макет экрана: enter image description here

Если вы используете UIRectEdgeNone, в контроллер просмотра не будет использовать полноэкранную компоновку, он будет нажимать вид вправо в нижней части панели навигации:

enter image description here

Я предлагаю использовать UIEdgeRectAll вместо UIEdgeRectNone, если вы действительно не хотите упорядочить рамки всех подзапросов, включая просмотр контроллера вида !!!!

+0

Нет ничего плохого в использовании UIEdgeRectNone. Значение по умолчанию - UIRectEdgeAll, поскольку поведение по умолчанию - это полупрозрачная панель навигации с содержимым, отображаемым снизу. При использовании непрозрачной навигационной панели имеет смысл отображать контент чуть ниже него. – Mercurial

+0

Я использую UIRectEdgeNone, чтобы обойти раздражения, которые возникают с видами, движущимися под навигационной панелью - пока это был самый простой способ, который я нашел программным путем. То, что сбивает с толку, - это то, почему мой пример * меняет * высоту после поворота. Я не возражаю против того, как он себя ведет, если он последователен. С вашим примером UIRectEdgeLeft + UIRectEdgeRight + UIRectEdgeBottom + UIRectEdgeNone я получаю 667 высоких, 667 длинных (повернутых), 603 высоких (повернутых), что совпадает с тем, что я получал раньше. Высота несовместима, независимо от того, что я там установил. –

+0

Я имел в виду при использовании по отдельности, а не путем добавления их !!!! –

Смежные вопросы