2
votes

So I am using AVCaptureSession to take pictures with front camera. I am also creating previewLayer from this session to display current image on screen.

previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

It all works like it should. But now I have a problem because I need to implement a button which will flip / mirror (transform) this preview layer - so users have a choice to take normal selfie picture or take mirrored one.

I have already tried transforming previewLayer and it KINDA works. The problem is that if you rotate device, preview picture rotates in the other way since it is transformed. (in the default or any other camera app picture rotates with camera). Anyone has any idea how to achieve that?

Mirroring preview layer: (I tried transforming layer and even view later, same result).

@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);
  }        
}
2

2 Answers

2
votes

Nowadays, if you use the mirrored property of the preview layer directly, you will get a deprecation warning at runtime. The current way to do it is using directly the connection from the camera. You must do something like this (code below is not real code, property names probably will differ, but you get the idea)

if (cameraPreviewLayer.connection.SupportsVideoMirroring) {
  cameraPreviewLayer.connection.automaticallyAdjustsVideoMirroring = false
  cameraPreviewLayer.connection.videoMirrored = true
}
1
votes

AVCaptureVideoPreviewLayer has a property mirrored. Set this true or false, as required.