Как получить правильную высоту вида в viewDidLayoutSubviews?

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"viewDidLayoutSubviews view.height: %f", self.view.frame.size.height);
}

В приведенном выше view.height всегда 1024, независимо от ориентации устройства. Даже поворот устройства приведет к viewDidLayoutSubviews будет вызван, и он все равно будет выводить 1024.

Тем не менее, представление выглядит хорошо. Какого черта я пропускаю?

2 ответа

Решение

Когда iOS выполняет автоматический поворот, это не меняет frame свойство представления корневого контроллера. Что он делает, так это применяет преобразование и анимирует изменение преобразования. Чтобы увидеть "фактический" размер вашего просмотра, проверьте bounds собственность вместо frame имущество.

Цитировать документацию Apple о transform имущество:

Предупреждение: если это свойство не является преобразованием идентичности, значение свойства frame не определено и поэтому должно игнорироваться.

Я думаю, что пришло время для обновления в iOS8. В iOS8:

  • UIScreen теперь ориентирован на интерфейс:
  • [UIScreen bounds] теперь ориентирован на интерфейс
  • [UIScreen applicationFrame] теперь ориентирован на интерфейс
  • Уведомления о рамке строки состояния ориентированы на интерфейс
  • Уведомления о кадре клавиатуры ориентированы на интерфейс
Другие вопросы по тегам