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

PresentViewController не поддерживает ориентацию в iOS 6

Я использую этот код

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    {
        [self presentViewController:navigationControllerCustom animated:YES completion:nil];
    }
    else
    {
        [self presentModalViewController:navigationControllerCustom animated:YES];
    }

Мое приложение имеет две ориентации Портрет и Портрет вверх ногами. Этот код хорошо работает с iOS 5.1, но ориентация не работает на iOS 6

Я также добавил этот код в мой класс navigationControllerCustom

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

-(NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}

Пожалуйста, помогите мне решить эту проблему.

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

4b9b3361

Ответ 1

Вы должны включить это в свой делегат приложения:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

Также убедитесь, что у контроллера просмотра есть следующее: он отлично работает для меня.

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

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

В документации также говорится, что UINavigationController's не запрашивает свой верхний контроллер просмотра для поддерживаемых ориентаций, хотя разработчик Apple на форумах разработчиков так сказал... кажется, что этого не происходит. Поэтому вы должны добавить категорию для UINavigationController, это тот, который я использую:

#import "UINavigationController+autorotate.h"

@implementation UINavigationController (autorotate)

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

@end

Для получения дополнительной информации о том, как работает AutoRotate на iOS 6 выполните этот ответ

Ответ 2

Вы забыли:

- (BOOL)shouldAutorotate {
    return YES;
}

Ответ 3

Просто скопируйте вставить этот фрагмент над кодом

@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}

@end

Ответ 4

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

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

в AppDelegate.

Если вы планируете поддерживать все ориентации в своем приложении, но разные ориентации на контроллерах PARENT View (например, в стеке UINavigationController), вы должны использовать

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

в сочетании со следующими способами в вашем контроллере родительского контроля.

    - (BOOL)shouldAutorotate

и

- (NSUInteger)supportedInterfaceOrientations

Но если вы планируете иметь разные настройки ориентации в разных CHILDREN ViewControllers в том же стеке навигации (например, я), вам нужно проверить текущий ViewController в стеке навигации.

В моем подклассе UINavigationController я создал следующее:

    - (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    int interfaceOrientation = 0;

    if (self.viewControllers.count > 0)
    {
        id viewController;
        DLog(@"%@", self.viewControllers);
        for (viewController in self.viewControllers)
        {
            if ([viewController isKindOfClass:([InitialUseViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else if ([viewController isKindOfClass:([MainViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else
            {
                 interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
            }
        }
    }
    return interfaceOrientation;
}

Поскольку вы больше не можете контролировать с помощью ViewControllers детей параметры поворота представленного контроллера представлений, вы должны каким-то образом перехватить какой контроллер просмотра в настоящее время находится в стеке навигации. Так вот что я сделал:). Надеюсь, что это поможет!

Ответ 5

Подкласс UINavigationController и переопределить mustAutorotate и поддерживаемыеInterfaceOrientations следующим образом:

-(BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

-(NSUInteger)supportedInterfaceOrientations
{
     return self.topViewController.supportedInterfaceOrientations;
}

И теперь вы можете контролировать свою ориентацию каждый ViewController. Просто переопределите два метода в каждом ViewController.