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

Почему iPhone 5 не поворачивается вверх

Я добавил новые методы в свой код, как описано в документах iOS 6 для iOS 6, но на iPhone 5 приложение не вращается вверх дном. Только для пейзажных Путей.

Здесь мой код от rootViewController:

- (NSUInteger)supportedInterfaceOrientations{
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
            UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
}
- (BOOL)shouldAutorotate{
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return YES;
}

Я попробовал также "UIInterfaceOrientationMaskAll", но никаких изменений. "Странный", мой iPhone 4 с iOS6 делает его вверх дном с тем же кодом.

Любые идеи?

4b9b3361

Ответ 1

IOS 6 использует ориентацию по умолчанию UIInterfaceOrientationMaskAll для iPad и UIInterfaceOrientationMaskAllButUpsideDown для iPhone. Если вы хотите, чтобы ваши ViewControllers на iPhone вращались во всех направлениях, включая UpsideDown, вы должны добавить метод iOS 6:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

для всех контроллеров представления. Если вы это сделали, и он не работает, я делаю ставку на использование TabViewController или NavigationController, где некоторые из представлений НЕ возвращают это. Все ViewControllers должны вернуть это для ЛЮБОГО из них, чтобы поддержать его.

В качестве альтернативы вы можете добавить категорию в класс UITabViewController или NavigationController, который является вашим rootViewController и переопределяет этот метод. Вы делаете это так:

@interface UITabBarController (RotationAll)
    -(NSUInteger)supportedInterfaceOrientations;
@end

@implementation UITabBarController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}
@end

Также это рекомендуемые в настоящее время подходы, обсуждаемые сейчас на форумах Apple Developer, с персоналом Apple, в котором говорилось, что предыдущая документация, которая обескураживает подкласс UINavigationController, устарела, и с iOS 6 это нормально.

Ответ 2

Благодаря Cliff Ribaudo действительно поможет полностью ответить на ваш проект UITabbarController, но в моем случае я использую только UINavigationController, поэтому я изменил ваш ответ для Categeory UINavigationController.

@interface UINavigationController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations;
@end   


@implementation UINavigationController (RotationAll)
  -(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
  }
@end

Ответ 3

Простите многословие, но я думаю, что ваш ответ ниже.

У меня была такая же проблема, но это происходило на всех устройствах IOS 6, в том числе на моем iphone 4. Чтение вашего вопроса на самом деле ответило мне. Я удалил это много веков назад, потому что ничего не делал:

- (NSUInteger)supportedInterfaceOrientations{    
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
            UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown); }

и мой код отлично работал в предыдущих версиях ios. Похоже, что это стало мандатом в ios 6. Но только для upsideDown. Другие ориентации работали нормально.

Итак, спасибо.

Вернитесь к своей проблеме. Проанализировали ли вы цель своего проекта, чтобы убедиться, что все "Поддерживаемые интерфейсные ориентации" темно-серые? Мне интересно, если перевернутый свет светло-серый (т.е. Непроверенный). Я нашел в быстром тесте, что в предыдущих версиях ios они тоже игнорируются. Пока вы возвращаете YES из mustAutorotateToInterfaceOrientation, он будет поддерживать ориентацию, но не в iOS 6.

Наконец, вы внедрили shouldAutorotate, которого у меня нет в моем коде. Я думаю, что это по умолчанию да. И я думаю, что это просто говорит os, чтобы попытаться повернуть, но тогда вы должны сказать, какие ориентации вы поддерживаете с shouldAutorotateToInterfaceOrientation. Но ваш фрагмент не показывает, что вы внедрили shouldAutorotateToInterfaceOrientation. Я бы предложил реализовать это, поскольку он сообщает ОС, какие ориентации, которые вы поддерживаете, возвращаете простое ДА, означает, что вы поддерживаете все.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    //return (interfaceOrientation == UIInterfaceOrientationPortrait);
    return YES;
}

Надеюсь, что это поможет.

Ответ 4

Целевые настройки по умолчанию не имеют направленной вверх ориентации, поэтому попробуйте следующее:

Перейти к файлу проекта выберите целевое приложение выберите вкладку "Summery" убедитесь, что все типы ориентации нажаты

Удачи:)

Ответ 5

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

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

в AppDelegate.

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

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

из AppDelegate в сочетании со следующими способами в вашем контроллере просмотра PARENT.

    - (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 детей параметры поворота представленного контроллера представлений, вы должны каким-то образом перехватить какой контроллер просмотра в настоящее время находится в стеке навигации. Так вот что я сделал:). Надеюсь, что это поможет!