Подтвердить что ты не робот

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 не срабатывает. Мне нужно сделать некоторую замену изображений на поворот, но я не могу получить никаких указаний на то, что произойдет поворот.

Спасибо заранее.

4b9b3361

Ответ 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");
        }
}