Как определить и применить альбомную ориентацию к AVCaptureVideoPreviewLayer в Swift?

В основном мне нужен ответ на этот вопрос ориентация AVCaptureVideoPreviewLayer - нужен ландшафт, за исключением Swift.

Я ориентируюсь на iOS 8, и у AVCaptureVideoPreviewLayer, похоже, нет функции setVideoOrientation.

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


person epalm    schedule 12.08.2015    source источник


Ответы (5)


Обнаружьте и примените его в viewWillLayoutSubviews или, если вы используете подкласс UIView в layoutSubviews.

Вот как:

override func viewWillLayoutSubviews() {
                
    let orientation: UIDeviceOrientation = UIDevice.current.orientation

    previewLayer.connection?.videoOrientation = {
        switch (orientation) {
        case .portrait:
            return .portrait
        case .landscapeRight:
            return .landscapeLeft
        case .landscapeLeft:
            return .landscapeRight
        default:
            return .portrait
        }
    }()
}
person 米米米    schedule 14.09.2015
comment
спасибо, сэр... вы спасли мой день... добавьте эту строку перед перерывом, это поможет previewLayer.frame = self.view.bounds - person Arpan Sharma; 01.07.2016
comment
Это необходимо обновить для последней версии Swift. Обратите внимание, что videoOrientation переворачивается относительно ориентации устройства для ландшафтных режимов. - person Jeff Muir; 15.09.2017

обновление для Свифт 3

  override func viewWillLayoutSubviews() {

    let orientation: UIDeviceOrientation = UIDevice.current.orientation
    print(orientation)

    switch (orientation) {
    case .portrait:
        videoPreviewLayer?.connection.videoOrientation = .portrait
    case .landscapeRight:
        videoPreviewLayer?.connection.videoOrientation = .landscapeLeft
    case .landscapeLeft:
        videoPreviewLayer?.connection.videoOrientation = .landscapeRight
    case .portraitUpsideDown:
            videoPreviewLayer?.connection.videoOrientation = .portraitUpsideDown
    default:
        videoPreviewLayer?.connection.videoOrientation = .portraitUpsideDown
    }
}
person Erik Mueller    schedule 08.11.2017

Мне нужно, чтобы он менял ориентацию, когда я поворачиваю iPad влево или вправо, решение, которое мне помогло:

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    let orientation = UIDevice.current.orientation

    switch (orientation) {
    case .portrait:
        videoPreviewLayer?.connection.videoOrientation = .portrait
    case .landscapeLeft:
        videoPreviewLayer?.connection.videoOrientation = .landscapeRight
    case .landscapeRight:
        videoPreviewLayer?.connection.videoOrientation = .landscapeLeft
    default:
        videoPreviewLayer?.connection.videoOrientation = .portrait
    }
}
person clopex    schedule 24.07.2018

Решение Xamarin в ViewController;

public override void ViewWillLayoutSubviews()
    {
        base.ViewWillLayoutSubviews();

        var videoPreviewLayerConnection = PreviewView.VideoPreviewLayer.Connection;
        if (videoPreviewLayerConnection != null)
        {
            var deviceOrientation = UIDevice.CurrentDevice.Orientation;
            if (!deviceOrientation.IsPortrait() && !deviceOrientation.IsLandscape())
                return;

            var newVideoOrientation = VideoOrientationFor(deviceOrientation);
            var oldSize = View.Frame.Size;
            var oldVideoOrientation = videoPreviewLayerConnection.VideoOrientation;
            videoPreviewLayerConnection.VideoOrientation = newVideoOrientation;
        }
    }
person vdidxho    schedule 22.02.2019

другое решение в Swift 4 будет использовать уведомление.

        NotificationCenter.default.addObserver(self,
                                           selector: #selector(detected),
                                           name: 

UIDevice.orientationDidChangeNotification, объект: ноль)

и в функции селектора вы можете проверить ориентацию:

let orientation: UIDeviceOrientation = UIDevice.current.orientation
switch orientation {
    case .portrait:
         stuff()
    case .landscapeLeft:
         stuffOther()
    case .landscapeRight
         stuffOther()
    default:
         stuffOther()
}

Не забудьте удалить наблюдателя, когда в этом нет необходимости.

ОЧЕНЬ ВАЖНО: ваш физический iPhone НЕ должен иметь блокировку при вращении (я потерял 2 часа на это, потому что в этом случае метод не перехватывается :) ).

person Alessio Campanelli    schedule 03.09.2019