iOS: панель навигации ' s titleView неправильно меняет размер при повороте телефона

Я пишу приложение для iPhone, которое (как и большинство приложений) поддерживает автоповорот: вы поворачиваете свой телефон, и его представления вращаются и изменяют размер соответствующим образом.

Но я назначаю настраиваемое представление для navigationItem.titleView (область заголовка панели навигации), и я не могу заставить это представление правильно изменять размер при повороте телефона.

Я знаю, что вы думаете: «Просто установите для его autoresizingMask значение UIViewAutoresizingF flexibleWidth | UIViewAutoresizingF flexibleHeight », но это не так просто. Конечно, если я не установил для своего представления autoresizingMask , то размер моего представления не изменится; и я хочу, чтобы он изменил размер.

Проблема в том, что если я действительно установил его autoresizingMask , то он изменит размер правильно, пока вид виден; но размер titleView неверен в этом сценарии:

  1. Запустите приложение, удерживая телефон в портретном режиме. Все выглядит хорошо.
  2. Сделайте что-нибудь, что заставит приложение поместить другое представление в стек навигации. Например, щелкните строку таблицы или кнопку, вызывающую вызов [self.navigationController pushViewController: someOtherViewController animated: YES] .
  3. При просмотре дочернего контроллера поверните телефон в горизонтальное положение.
  4. Щелкните значок Кнопка «Назад» для возврата к просмотру верхнего уровня. На данном этапе, вид заголовка перепутался: хотя вы держите телефон в альбомной ориентации, вид заголовка все еще имеет размер, как если бы вы держали его в портретном режиме.
  5. Наконец, поверните телефон обратно в портретный режим. Теперь все становится еще хуже: размер заголовка уменьшается (так как панель навигации стала меньше), но поскольку оно и так было слишком маленьким, теперь оно намного слишком мало.

Если вы хотите воспроизвести это самостоятельно, выполните следующие действия (это небольшая работа):

  1. Создайте приложение с помощью мастера Xcode «Приложение на основе навигации».
  2. Настройте его так, чтобы в табличном представлении верхнего уровня были строки, которые, когда щелкнув их, поместите подробное представление в стек навигации.
  3. Включите этот код как в контроллер представления верхнего уровня, так и в контроллер представления подробностей:

     - (BOOL) shouldAutorotateToInterfaceOrientation:
     (UIInterfaceOrientation) interfaceOrientation {
     return (interfaceOrientation! = UIInterfaceOrientationPortraitUpsideDown);
    }
    
  4. Включите этот код только в контроллер представления верхнего уровня:

     - (void) viewDidLoad {
     [супер viewDidLoad];
    
     // Создаем кнопку "Назад"
     UIBarButtonItem * backButton = [[UIBarButtonItem alloc] initWithTitle: @ "Мастер"
     стиль: UIBarButtonItemStylePlain цель: ноль действие: ноль];
     self.navigationItem.backBarButtonItem = backButton;
     [отпускание backButton];
    
     // Создаем вид заголовка
     UILabel * titleView = [[[UILabel alloc] initWithFrame: CGRectMake (0,0,500,38)] автозапуск];
     titleView.textAlignment = UITextAlignmentCenter;
     titleView.text = @ "Посмотреть этот заголовок";
    
     // Если я оставлю включенной следующую строку, то изменение размера окна заголовка
     // испортится, если я:
     //
     // 1. Начнем с основного представления (которое использует это представление заголовка) в портретной ориентации
     // 2. Перейдите к подробному просмотру
     // 3. Поверните телефон в горизонтальное положение
     // 4. Вернемся к основному представлению
     // 5. Верните телефон в вертикальное положение.
     //
     // С другой стороны, если я удалю следующую строку, я получу другую
     // проблема: размер окна заголовка меняется не так, как я хочу, когда я:
     //
     // 1. Начнем с основного представления (которое использует это представление заголовка) в портретной ориентации
     // 2. Поверните телефон в горизонтальное положение
    titleView.autoresizingMask = UIViewAutoresizingF flexibleWidth | UIViewAutoresizingF flexibleHeight;
    
     self.navigationItem.titleView = titleView;
    }
    
  5. Наконец, следуйте моим инструкциям по воспроизведению.

Итак ... я что-то делаю не так? Есть ли способ заставить мой titleView всегда правильно изменять размер?

13
задан westsider 14 January 2011 в 06:31
поделиться