Как установить previewLayer.connection.videoOrientation в Swift 2?

В Objective-C вы можете сделать это:

if ( UIDeviceOrientationIsPortrait( deviceOrientation ) || UIDeviceOrientationIsLandscape( deviceOrientation ) ) {
    AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.previewView.layer;
    previewLayer.connection.videoOrientation = (AVCaptureVideoOrientation)deviceOrientation;
}

Но в Swift, как лучше всего перевести эту последнюю строку? Вы не можете сделать "deviceOrientation as AVCaptureVideoOrientation".

Лучшее, что я мог придумать, это:

    if(UIDeviceOrientationIsPortrait(deviceOrientation) || UIDeviceOrientationIsLandscape(deviceOrientation)) {
        let myPreviewLayer: AVCaptureVideoPreviewLayer = self.previewLayer
        myPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientation.init(rawValue: deviceOrientation.rawValue-1)!
    }

Но это кажется не элегантным. Здесь есть -1, потому что это просто перечисление в конце дня, а перечисление UIDeviceOrientation имеет "Неизвестный" в положении 0, которого нет у AVCaptureVideoOrientation...

4 ответа

Это отлично справляется со Swift 4:

previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!

Попробуй это

let avLayer = (self.previewView.layer as AVCaptureVideoPreviewLayer)
let connection = avLayer.connection
let orientation = AVCaptureVideoOrientation(rawValue: self.interfaceOrientation.rawValue)!
connection.videoOrientation = orientation
connection.videoOrientation = AVCaptureVideoOrientation.Portrait

Вы можете найти значения констант AVCaptureVideoOrientation в быстрых заголовочных файлах. (Свифт 2)

Это преобразование, которое я получил:

if UIDeviceOrientationIsPortrait(deviceOrientation) || UIDeviceOrientationIsLandscape(deviceOrientation) {
    var previewLayer: AVCaptureVideoPreviewLayer = previewView.layer
    previewLayer.connection.videoOrientation = deviceOrientation
}

Конвертер, который я использовал, как правило, не знает, как должен выглядеть код несколько раз (Int против CGFloat) так что это может не работать без устранения ошибок. дайте мне знать, если он делает то, что вы хотите, например, переменная, вероятно, может быть изменена на константу.

Другие вопросы по тегам