Выборочная авторизация в UINavigationController и UITabBarController

Привет! Вот сценарий.

Начиная с контроллера навигации (и нет панели вкладок - она скрыта от предыдущего нажатия контроллера представления), я запускаю новый контроллер представления и помещаю его в стек контроллера навигации. Этот новый ВК содержит одинокийUIView в который я программно добавляю UIScrollView с тем же фреймом. (Я хотел избежатьUIView, но это был единственный способ, которым я мог получитьself.view быть назначенным на что-то. Я подозреваю, чтоUIScrollView вUIView вviewDidLoad не рекомендуется.)

Итак, теперь у нас есть навигационная панель и вид прокрутки. Я настроил его для прокрутки некоторых изображений (я знаю, это удивительно!), И это прекрасно работает. Теперь я хочу, чтобы это поддерживало автоповорот. Поэтому я отвечаю в ВК так:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Скомпилируйте и запустите. Аааа ... ничего. Очевидно, я сделал что-то не так.

Сейчас я уже прочитал пост, касающийсяUINavigationController и авторотацияи у меня появляется скрывающееся подозрение, что я поступаю неправильно и делаю это более сложным, чем необходимо.

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

В идеале мне бы хотелось что-то без показа навигационной панели. Вместо этого у нас есть панель инструментов / строка состояния, которая появляется / скрывается сверху (как вы видите при воспроизведении видео). Если навигационная панель должна остаться - или если это ДЕЙСТВИТЕЛЬНО навигационная панель меньшей высоты, которую я вижу при воспроизведении видео по сравнению с панелью инструментов, однако получу ли я вращение вокруг нее? Дело в том, что я хочу, чтобы он вращался только в этом конкретном режиме при просмотре пикселя. Не в любое другое время.

Смею ли я попробовать использовать модальный ВК? (Yeccch - нет, это тоже не может быть правильным. Плюс у него все равно есть навигационная панель.)

 Joe D'Andrea28 июл. 2009 г., 23:26
Этот поток может содержать подсказку (касающуюся цепочки VC):discussions.apple.com/thread.jspa?threadID=1646143

Ответы на вопрос(3)

Это может быть еще проще:

1) ПодклассUITabBarController и реализоватьshouldAutorotate... как вы описали (второй фрагмент кода)

2) Измени свойxxxAppDelegate.h иметь классUITabBarController изменился на подкласс, который вы только что создали. (используйте #import YourNewTabBarController.h)

3) ВMainWindow.xib измените класс контроллера панели вкладок на ваш новый класс.

Presto!

PS:YourNewTabBarController следует ТОЛЬКО реализоватьshouldAutoRotate.... Remove all other (auto generated) stuff.

 21 дек. 2011 г., 16:26
работает как шарм. Спасибо.
Решение Вопроса

Вы можете решить эту проблему без создания подклассов, создав категорию UITabBarController.

Вот реализация категории, которая обрабатывает мой случай, когда у меня есть анонимные контроллеры UINavigationController, связанные с моими вкладками, и пользовательские подклассы UIViewController в качестве корневых контроллеров представления UINavigationControllers:

@implementation UITabBarController (Rotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{   
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
        UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers objectAtIndex:0];
        return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

У меня также есть категория на UINavigationController, которая по умолчанию возвращает YES. Таким образом, поведение по умолчанию - включить вращение, и я могу вернуть NO из shouldAutorotateToInterfaceOrientation: interfaceOrientation только для контроллеров и ориентаций, для которых я хочу отключить вращение.

 16 мар. 2013 г., 06:28
Отличный ответ спасибо. +1
 07 авг. 2012 г., 09:22
я создал категорию на UITabBarController так же, как ответ, и я также создал категорию для UINavigationController и возвращает только ДА, но я не могу заставить его работать, извините ..: / как вы это делаете?
 04 мая 2011 г., 08:39
отличный. Очень полезно
 Joe D'Andrea11 февр. 2011 г., 14:59
Brilliant! Категории намного чище, а использование двух в тандеме еще слаще.
 25 мая 2011 г., 07:37
Отлично, но у меня была проблема с любыми вкладками, которые были контроллерами навигации, если они были внутри "больше". вкладка (наше приложение имеет много вкладок). Мой обходной путь здесь:splinter.com.au/finding-the-currently-visible-view-in-a-uitab

Да, этоwas проще чем я думал!

Правда, панель вкладок не видна ... но это по-прежнему, по сути, приложение на основе панели вкладок.

Если толькоUITabBarController разрешает автоповорот, все ставки отключены для любых других просмотров. Таким образом, это просто вопрос подклассовUITabBarController и соответственно реагировать наshouldAutorotateToInterfaceOrientation: (вместо того, чтобы сделать его частью App Delegate, как это делает Xcode по умолчанию).

Как ты это делаешь? Рад, что ты спросил. Выполните эти шаги только в том случае, если вы создали приложение контроллера панели вкладок с использованием значений по умолчанию Xcode. (BACKUP ваша работа, прежде чем пытаться это! Отказ от ответственности Отказ от ответственности, Ядда Ядда.)

Create a new UIViewController subclass (we'll call it VC). Adjust it to be a subclass of a UITabBarController with an explicit delegate of UITabBarControllerDelegate. Transplant all the Tab Bar delegate bits from your App Delegate into this new VC. In your new VC's viewDidLoad method, add self.delegate = self; to the end. In MainWindow.xib (or wherever your tab bar controller and tab bar are defined), pick your Tab Bar Controller object and go to the Identity Inspector (Cmd-4). Change the class to your new VC instead of the standard UITabBarController class.

Теперь мы находимся в бизнесе. Просто добавьте это в новый источник VC:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES; // Adjust to taste
}

Почему делегат материал? Владелец файла IBUIApplicationи я не могу связать делегата с моим новым ВК через IB. Так как я хочу получить возможность ответить на методы делегата, я добавил это явно. Если вам это не нужно, все в порядке, если вы не обращаете на это внимания. (Если этоcan быть сделано в IB, кто-то, пожалуйста, вмешайтесь!)

Единственный оставшийся трюк - это установитьYES selectively, Возможно, вы не хотите поддерживать автоповорот постоянно (как в моем случае). Вот как я это делаю. Сначала я изменяю этот недавно добавленный метод (сверху) ... на этот:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {   
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

Теперь я могу ответить на этот же метод с любого из VC моего приложения, и он перейдет к контроллеру панели вкладок! Например, в моем приложении у меня есть VC, который я хочу показывать только в Portrait, поэтому я отвечаю так:

return (interfaceOrientation == UIInterfaceOrientationPortrait);

Тем не менее, этот самый VC может принять пользователя в фотогалерею, для которой яdo хочу разрешить некоторое вращение. В этом методе автоматического поворота VC я отвечаю по-другому:

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

Теперь представление галереи позволит осуществлять автоповорот во все ориентации, кроме перевернутого портрета, плюс, когда я возвращаюсь вверх по цепочке контроллера вида, ориентация возвращается в портретную. :)

Ваш ответ на вопрос