ios - 如何将 AVCaptureVideoPreviewLayer 旋转 90 度以在 iOS11 中更正它?

标签 ios swift ipad ios-camera

我有一个 AVCaptureVideoPreviewLayer,它设置为使用前置摄像头源捕获 session 的实时预览。但是,输出旋转了 90 度,我试图让该层与我的应用程序的其余部分对齐,该应用程序处于 Landscape 方向。有没有办法将它旋转 90 度 以更正它?

到目前为止,这是我的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    let captureSession = AVCaptureSession()

    guard let captureDevice = getDevice(position: .front) else { return }
    guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }
    captureSession.addInput(input)

    captureSession.startRunning()

    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    view.layer.addSublayer(previewLayer)
    previewLayer.frame = view.frame
    previewLayer.videoGravity = .resizeAspectFill
    previewLayer.connection?.automaticallyAdjustsVideoMirroring = false
    previewLayer.connection?.isVideoMirrored = false
}

func getDevice(position: AVCaptureDevice.Position) -> AVCaptureDevice? {
    let devices = AVCaptureDevice.devices() as NSArray;
    for de in devices {
        let deviceConverted = de as! AVCaptureDevice
        if(deviceConverted.position == position){
            return deviceConverted
        }
    }
    return nil
}

最佳答案

能否将 previewLayer 添加到另一个 UIView 中,然后像这样旋转:

private var captureView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.captureView = UIView(frame: self.view.bounds)
    self.captureView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.view.addSubview(captureView)

    // ...
    captureView.layer.addSublayer(previewLayer)
    // ...

    self.rotateView(animated: false)
}

// Rotating captureView based on device orientation
func rotateView(animated: Bool) {
    var transform: CGAffineTransform?
    switch UIDevice.current.orientation {
    case .portraitUpsideDown:
        transform = CGAffineTransform(rotationAngle: CGFloat.pi)
    case .landscapeLeft:
        transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2)
    case .landscapeRight:
        transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2)
    default:
        break
    }

    guard animated else {
        self.captureView.transform(transform)
        return
    }

    UIView.animate(withDuration: 0.5, animations: {[weak self] in
        self?.captureView.transform(transform)
    })
}

关于ios - 如何将 AVCaptureVideoPreviewLayer 旋转 90 度以在 iOS11 中更正它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473354/

相关文章:

swift - 了解常规版本和通用版本之间的函数调用优先级

swift - 如何找到彼此等距的直线上的点

ios - SQLite Drop Table导致Database is Locked错误

iphone - 如何通过应用内购买限制以前可用的功能

ios - Metal sample 计数

objective-c - NSInvalidArgumentException - 设置 AllHTTPHeaderFields

IOS/Objective-C : App crashes with core data - pressing the save button

c++ - Swift、C++ 和结构

iPhone 中的 Android Toast?

iphone - sizeToFit 运行异常