"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, но я не знаю, что и как заменить это в состоянии коммутатора.

4 63

4 ответа:

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

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

[[UIApplication sharedApplication] statusBarOrientation]

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

начиная с 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, ни границы просмотра.

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

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

чего еще не хватает-это способ понять направление изменения ориентации интерфейса, что очень важно во время анимации.
в сессия WWDC 2014 "View controller advancement in 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];
      }];
}

Swift 4 version

UIApplication.shared.statusBarOrientation