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

Как я могу уведомить систему о том, когда поддерживаетсяInterfaceOrientations?

Моя реализация контроллера корневого представления supportedInterfaceOrientations почти всегда возвращает UIInterfaceOrientationMaskAll, однако есть один крайний случай, когда он возвращает UIInterfaceOrientationMaskLandscape.

Это работает, если пользователь поворачивает устройство. Однако, если устройство удерживается в портретном режиме, метод supportedInterfaceOrientations никогда не вызывается, если пользователь не вручную вращает устройство.

Как я могу программно сообщить системе о том, что возвращаемое значение этого метода изменилось?

В соответствии с документацией мне кажется, что я могу вызвать [UIViewController attemptRotationToDeviceOrientation], но это не имеет никакого эффекта (supportedInterfaceOrientations никогда не вызывается и экран не вращается).

Я нашел различные обходные пути, которые другие опубликовали, чтобы попытаться решить эту проблему, но ни один из них не работает в моих тестах. Я подозреваю, что они, возможно, работали в iOS 5.0, но не iOS 6.0.

Я возвращаю YES в корневом представлении контроллера shouldAutorotate.

4b9b3361

Ответ 1

Прежде всего, это может быть полезно, если вы использовали это, если хотите представить свой UIViewController в ландшафтном режиме.

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

Кроме того, многое зависит от того, в какой контроллер встроен ваш UIViewController.

Например, если его внутри UINavigationController, то вам может потребоваться подкласс, чтобы UINavigationController переопределил методы ориентации, подобные этому.

subclassed UINavigationController (верхний диспетчер представления иерархии будет контролировать ориентацию.) необходимо установить его как self.window.rootViewController.

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

Из iOS 6 указано, что UINavigationController не будет запрашивать поддержку UIVIewControllers для поддержки ориентации. Следовательно, нам нужно было бы подклассифицировать его.

Примечание:

Метод shouldAutorotate и supportedInterfaceOrientations всегда вызывается для UINavigationController всякий раз, когда выполняются операции Push.

Ответ 2

Цитата из справочника Apple UIViewController:

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

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

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

Обновление: Я нашел это сообщение, которое должно помочь с поворотами после запуска. Очевидно, что iOS 6 смотрит на контроллер навигации, чтобы определить поддерживаемые ориентации устройств.

Как заставить ориентацию UIViewController на портретную ориентацию в iOS 6

Ответ 3

Вам нужно вручную повернуть его. Вы хотите вызвать следующую логику в своем методе контроллера viewWillAppear::

UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
if (![self supportsOrientation:curDevOrientation]) {
    // We're going to rotate 90 degrees clockwise.  First figure out what that
    // means to the status bar.
    UIInterfaceOrientation newStatusBarOrientation;
    switch (curDevOrientation)  {
        case UIDeviceOrientationPortrait:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeRight;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            newStatusBarOrientation = UIInterfaceOrientationLandscapeLeft;
            break;
    }
    [[UIApplication sharedApplication] setStatusBarOrientation:newStatusBarOrientation animated:NO];

    // Now rotate the view 90 degrees clockwise.
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 90.0 / 180.0);
    self.view.transform = transform;
}

Это должно вращать представление вида контроллера, всякий раз, когда он появляется.