"interfaceOrientation" устарел в iOS 8, Как изменить этот метод Objective C

Я загрузил представление simpleCamera из Cocoa элементов управления, которые используют этот метод

- (AVCaptureVideoOrientation)orientationForConnection
{
    AVCaptureVideoOrientation videoOrientation = AVCaptureVideoOrientationPortrait;
    switch (self.interfaceOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
            videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
            break;
        case UIInterfaceOrientationLandscapeRight:
            videoOrientation = AVCaptureVideoOrientationLandscapeRight;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown;
            break;
        default:
            videoOrientation = AVCaptureVideoOrientationPortrait;
            break;
    }
    return videoOrientation;
}

проблема "interfaceOrientation" устарела в iOS 8, но я не знаю, что и как ее заменить в состоянии Switch.

Ответ 1

Неправильная ориентация устройства. Например, устройство может находиться в ландшафтном режиме, но контроллер просмотра, который поддерживает только портрет, останется в портрете.

Вместо этого используйте это:

[[UIApplication sharedApplication] statusBarOrientation]

Еще один бонус в том, что он по-прежнему использует перечисление UIInterfaceOrientation, поэтому очень мало нужно изменить код.

Ответ 2

Начиная с iOS8, Apple рекомендует использовать TraitCollections (классы размера) вместо interfaceOrientation.

Кроме того, поскольку iOS 9 и новая функция iPad "Многозадачность", есть случаи, когда ориентация устройства не соответствует размеру окна! (нарушение пользовательского интерфейса приложения)

Таким образом, вы также должны быть очень осторожны при использовании классов стандартного размера, потому что это не обязательно займет весь экран iPad.

Иногда TraitCollections не заполняет все ваши потребности в дизайне. В этих случаях Apple рекомендует сравнивать границы просмотров:

if view.bounds.size.width > view.bounds.size.height {
    // ...
}

Я был очень удивлен, но вы можете проверить видео WWDC 2015 Начало работы с многозадачностью iPad в iOS 9 в 21'15.

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

Ответ 3

Использование свойства -orientation свойства UIDevice неверно (даже если оно может работать в большинстве случаев) и может привести к некоторым ошибкам, например UIDeviceOrientation рассмотреть также ориентацию устройства, если оно находится лицом вверх или вниз, для этих значений нет пары в UIInterfaceOrientation перечислении.
Кроме того, если вы заблокируете свое приложение в определенной ориентации, UIDevice предоставит вам ориентацию устройства, не принимая во внимание.
С другой стороны, iOS8 отказался от свойства interfaceOrientation в классе UIViewController.
Для определения ориентации интерфейса доступны 2 варианта:

  • Используйте ориентацию строки состояния
  • Используйте классы размера, на iPhone, если они не переопределены, они могут дать вам способ понять текущую ориентацию интерфейса

Что еще не хватает, это способ понять направление изменения ориентации интерфейса, что очень важно во время анимации.
В сессии WWDC 2014 "Просмотр прогресса контроллера в iOS8" динамик обеспечивает решение эта проблема тоже, используя метод, который заменяет -will/DidRotateToInterfaceOrientation.

Здесь предлагаемое решение частично реализовано:

-(void) viewWillTransitionToSize:(CGSize)s withTransitionCoordinator:(UIVCTC)t {
    orientation = [self orientationFromTransform: [t targetTransform]]; 
    oldOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    [self myWillRotateToInterfaceOrientation:orientation duration: duration]; 
    [t animateAlongsideTransition:^(id <UIVCTCContext>) {
         [self myWillAnimateRotationToInterfaceOrientation:orientation
                                                  duration:duration];
      }
      completion: ^(id <UIVCTCContext>) {
         [self myDidAnimateFromInterfaceOrientation:oldOrientation];
      }];
}