Ios 镜像(翻转)摄影机预览层

Ios 镜像(翻转)摄影机预览层,ios,swift,camera,avcapturesession,Ios,Swift,Camera,Avcapturesession,所以我用AVCaptureSession用前置摄像头拍照。我还从这个会话创建了previewLayer,以便在屏幕上显示当前图像 previewLayer = AVCaptureVideoPreviewLayer(session: session) previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 这一切都是正常的。 但现在我遇到了一个问题,因为我需要实现一个按钮来翻转/镜像(转换)这个预览层,所以用户可以选择拍摄普

所以我用AVCaptureSession用前置摄像头拍照。我还从这个会话创建了previewLayer,以便在屏幕上显示当前图像

previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
这一切都是正常的。 但现在我遇到了一个问题,因为我需要实现一个按钮来翻转/镜像(转换)这个预览层,所以用户可以选择拍摄普通的自拍照片或镜像照片

我已经尝试过转换previewLayer,它有点有效。问题是,如果旋转设备,预览图片会以另一种方式旋转,因为它已被转换。(在默认或任何其他相机应用程序中,图片随相机旋转)。有人知道如何做到这一点吗

镜像预览层:(我尝试转换层,甚至稍后查看,结果相同)


AVCaptureVideoPreviewLayer
具有镜像的属性
。根据需要将此设置为true或false。

现在,如果直接使用预览层的
镜像属性,将在运行时收到弃用警告。目前的做法是直接使用摄像头的连接。您必须这样做(下面的代码不是真正的代码,属性名称可能会有所不同,但您明白了)

这个答案已经过时了(镜像的
属性已被弃用),请参阅我的答案
@IBAction func mirrorCamera(_ sender: AnyObject) {      
  cameraMirrored = !cameraMirrored
  if cameraMirrored {
    // TRANSFORMING VIEW
    self.videoPreviewView.transform = CGAffineTransform(scaleX: -1, y: 1);
    // OR LAYER
    self.previewLayer.transform = CATransform3DMakeScale(-1, 1, 1); 
  } else {
    self.videoPreviewView.transform = CGAffineTransform(scaleX: 1, y: 1);
    self.videoPreviewView.transform = CATransform3DMakeScale(1, 1, 1);
  }        
}
if (cameraPreviewLayer.connection.SupportsVideoMirroring) {
  cameraPreviewLayer.connection.automaticallyAdjustsVideoMirroring = false
  cameraPreviewLayer.connection.videoMirrored = true
}