Вращение UIView с помощью AVCaptureVideoPreviewLayer в качестве подслоя

Я хочу повернуть UIVIew с AVCaptureVideoPreviewLayer в качестве подслоя.

В UIView появляются две кнопки (одна поворачивает слой предварительного просмотра видео влево, а другая вправо), и когда пользователь нажимает одну из них, каждый раз поворачивает слой предварительного просмотра на 1 градус.

override func viewDidLoad() {
   ...
   videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
   videoPreviewLayer?.frame = self.view.bounds
   videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
   previewView.layer.addSublayer(videoPreviewLayer!)
}


@objc func rotateRight() {
    degrees += 1

    // 1st possibility - Scale the UIView that contains the previewLayer for 2x
    /*
    previewView.transform = CGAffineTransform(scaleX: 2, y: 2)
    previewView.transform = CGAffineTransform(rotationAngle: (CGFloat(degrees / 180.0 * .pi)))
    previewView.transform = CGAffineTransform.identity
    */

    // 2nd possibility - Make bigger the previewLayer so when it's rotate doesn't appear the background color of the UIView
    /*
    videoPreviewLayer?.frame = CGRect(x: -200, y: -200, width: 800, height: 1200)
    videoPreviewLayer?.position = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
    videoPreviewLayer?.transform = CATransform3DMakeRotation(CGFloat(degrees / 180.0 * .pi), 0.0, 0.0, 1.0)
    */

    // 3rd possibility
    /*
    videoPreviewLayer?.frame = CGRect(x: -200, y: -200, width: 800, height: 1200)
    videoPreviewLayer?.position = CGPoint(x: view.bounds.width * 0.5, y: view.bounds.width * 0.5)
    videoPreviewLayer?.transform = CATransform3DMakeRotation(CGFloat(degrees / 180.0 * .pi), 0.0, 0.0, 1.0)
    */

    // 4th possibility
    UIView.animate(withDuration: 1, animations: {
        self.previewView.contentMode = UIViewContentMode.scaleToFill
        self.previewView.transform = CGAffineTransform(rotationAngle: CGFloat(self.degrees))
    })
}

ТРЕБУЕТСЯ ОКОНЧАТЕЛЬНЫЙ РЕЗУЛЬТАТ Требуется окончательный результат

ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ

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

Результат второго варианта кода ссылка

Результат третьего варианта кода ссылка


person Karina Fernandez    schedule 07.12.2017    source источник


Ответы (1)


Ты пробовал

if let videoPreviewLayerConnection = videoPreviewLayer.connection {
    videoPreviewLayerConnection.videoOrientation = desiredOrientation
}
person adamfowlerphoto    schedule 12.12.2017