Я пишу приложение для iPhone, которое (как и большинство приложений) поддерживает автоматическое вращение: вы поворачиваете свой телефон, и его виды вращаются и изменяются соответствующим образом.
Но я назначаю пользовательское представление navigationItem.titleView
(область заголовка панели навигации), и я не могу получить это представление для правильного изменения размера, когда телефон вращается.
Я знаю, что вы думаете: "Просто установите его autoresizingMask
на UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
", но это не так просто. Конечно, если я не установлю свой взгляд autoresizingMask
, то мое представление не изменится; и я хочу, чтобы он изменялся.
Проблема заключается в том, что если я устанавливаю его autoresizingMask
, то он правильно изменяется, пока это вид будет видимым; но размер titleView
становится испорченным в этом сценарии:
- Запустите приложение, удерживая телефон в портретном режиме. Все выглядит хорошо.
- Сделайте что-то, что заставляет приложение нажимать другое представление на стек навигации. Например. щелкните строку таблицы или кнопку, вызывающую вызов
[self.navigationController pushViewController:someOtherViewController animated:YES]
. - Во время просмотра дочернего контроллера поверните телефон в положение "пейзаж".
- Нажмите кнопку "Назад", чтобы вернуться к просмотру верхнего уровня. На данный момент вид заголовка перепутался: хотя вы держите телефон в альбомном режиме, название заголовка по-прежнему имеет размер, как если бы вы держали его в портретном режиме.
- Наконец, поверните телефон обратно в портретный режим. Теперь ситуация становится еще хуже: размер заголовка уменьшается (поскольку панель навигации уменьшилась), но поскольку она уже слишком мала, теперь она слишком мала.
Если вы хотите воспроизвести это самостоятельно, выполните следующие действия (это немного работает):
- Создайте приложение, используя мастер Xcode "Навигационное приложение".
- Установите его так, чтобы в представлении таблицы верхнего уровня были строки, которые при нажатии на них нажимают подробный вид на стек навигации.
-
Включите этот код как в контроллер верхнего уровня, так и в контроллер подробного представления:
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); }
-
Включите этот код только в контроллер верхнего уровня:
- (void)viewDidLoad { [super viewDidLoad]; // Create "Back" button UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Master" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; // Create title view UILabel* titleView = [[[UILabel alloc] initWithFrame:CGRectMake(0,0,500,38)] autorelease]; titleView.textAlignment = UITextAlignmentCenter; titleView.text = @"Watch this title view"; // If I leave the following line turned on, then resizing of the title view // messes up if I: // // 1. Start at the master view (which uses this title view) in portrait // 2. Navigate to the detail view // 3. Rotate the phone to landscape // 4. Navigate back to the master view // 5. Rotate the phone back to portrait // // On the other hand, if I remove the following line, then I get a different // problem: The title view doesn't resize as I want it to when I: // // 1. Start at the master view (which uses this title view) in portrait // 2. Rotate the phone to landscape titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.navigationItem.titleView = titleView; }
-
Наконец, следуйте моим инструкциям.
Итак... я делаю что-то неправильно? Есть ли способ сделать мой TitleView всегда правильно измененным?