IOS 6 shouldAutorotate: НЕ вызывается
Я искал интернет для решения этого, но ничего не нашел. Я пытаюсь сделать iOS 5 iOS 5 совместимым. Я не могу заставить работу ориентации работать правильно. Я не могу обнаружить, когда произойдет ротация. Вот код, который я пытаюсь сделать:
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
Новый метод supportedInterfaceOrientation: метод получится вызванным просто отлично. Однако метод shouldAutorotate не срабатывает. Мне нужно сделать некоторую замену изображений на поворот, но я не могу получить никаких указаний на то, что произойдет поворот.
Спасибо заранее.
Ответы
Ответ 1
Убедитесь, что при запуске приложения появляется следующая ошибка.
В окнах приложений ожидается, что в конце запуска приложения будет установлен корневой контроллер.
Если это так, исправите это, внося следующее изменение в файл AppDelegate.m
(хотя, кажется, есть несколько ответов, как исправить это):
// Replace
[self.window addSubview:[navigationController view]]; //OLD
// With
[self.window setRootViewController:navigationController]; //NEW
После этого следует правильно вызвать shouldAutoRotate
.
Ответ 2
При использовании UINavigationController в качестве основы для приложения я использую следующий подкласс, чтобы предоставить мне гибкость, позволяющую самому большому контроллеру просмотра для детей принимать решение о вращении.
@interface RotationAwareNavigationController : UINavigationController
@end
@implementation RotationAwareNavigationController
-(NSUInteger)supportedInterfaceOrientations {
UIViewController *top = self.topViewController;
return top.supportedInterfaceOrientations;
}
-(BOOL)shouldAutorotate {
UIViewController *top = self.topViewController;
return [top shouldAutorotate];
}
@end
Ответ 3
Этот метод не является правильным способом определить это. Правильный метод willRotateToInterfaceOrientation:duration:
Метод должен вращаться в направлении ориентации (в отличие от toAutoTotate), который устарел и больше не будет называться iOS 6, но он не должен использоваться так, как вы его использовали.
РЕДАКТИРОВАТЬ Ответ на повторяющиеся downvotes. Пожалуйста, объясните, почему использование метода, который я указал, не является (указывать OP) "указанием на то, что произойдет поворот". Содержимое вопроса и заголовок несовместимы.
Ответ 4
Похоже, что на iOS 6 контроллер перемещения контейнеров не обращается к контроллерам дочерних представлений при вращении:
в примечания к выпуску iOS 6:
Теперь контейнеры iOS (например, UINavigationController) не консультироваться их детей, чтобы определить, должны ли они авторотировать. От интерфейс по умолчанию, приложение и поддерживаемые интерфейсы просмотра ориентации установлены на UIInterfaceOrientationMaskAll для iPad идиома и UIInterfaceOrientationMaskAllButUpsideDown для iPhone идиомы.
Это легко проверить. То, что я сделал, - использовать тот же пользовательский контроллер просмотра
- первый случай как основной контроллер представления
- второй случай как дочерний элемент UIPageViewController
В первом случае в пользовательском контроллере навигации все определяется комбинацией shouldAutorotate
и supportedInterfaceOrientations
, учитывая, что supportedInterfaceOrientations
согласуется с поддерживаемыми ориентациями приложения.
Во втором случае, даже если supportedInterfaceOrientations
настраиваемого контроллера представления вызывается UIPageViewController, возвращаемое значение не принимается к рассмотрению. Он работает, если два метода перезаписываются в подклассе UIPageViewController. Я не уверен в побочных эффектах этого, поскольку этот класс не должен быть подклассом.
Ответ 5
Если ваш viewController
является дочерним viewController
в UINavigationController
, вы можете сделать следующее:
- Подкласс
UINavigationController
- переопределить
shouldAutoRotate
в вашем подклассе
- отправьте свое
topViewController
это сообщение, когда этот метод вызывается
//Этот метод находится внутри вашего подкласса UINavigationController
- (BOOL)shouldAutorotate
{
if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
{
return [self.topViewController shouldAutorotate];
}
return NO;
}
- Теперь ваш viewControllers ответят соответственно на этот метод.
- Обратите внимание, что вы можете сделать то же самое с другими методами orinetaion
Ответ 6
Я также получаю следующую ошибку при запуске приложения.
"Окна приложений, как ожидается, будут иметь контроллер корневого представления в конце запуска приложения"
Я использую UISplitViewController * splitViewController
Если это так, то исправлено это путем внесения следующего изменения в файл AppDelegate.m:
Заменить
[self.window addSubview:[splitViewController view]];
С
[self.window setRootViewController:splitViewController];
После этого shouldAutoRotate
был вызван и работал правильно.
Ответ 7
Я использую iOS 7, но я считаю, что мое дело может быть полезным для других.
У меня есть иерархия контроллера глубокого обзора, основанная на UITabBarController. Единственное место, где должен быть вызван Autorotate, находится внутри UITabBarController. Поэтому я просто подклассифицирую UITabBarController и ставил свою логику управления движением внутри моего метода toAutorotate.
Ответ 8
Вот как я это сделаю
если вы хотите проверить текущую ориентацию, добавьте эту строку в файл viewconrtoller.m.
#define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown
тогда, где вы хотите проверить ориентацию, напишите условие, как показано ниже
- (void)viewDidLoad
{
if(isPortrait)
{
//portrait mode....
NSLog(@"its in IsPotraitMode");
}
else
{
//landscape mode....
NSLog(@"its in IsLandscapeMode");
}
}