UIImagePickerController 前置摄像头在预览视图中显示镜像

UIImagePickerController front camera show mirror image on preview view

我知道很多人问过这个问题,但我没有找到解决这个问题的正确答案,我的问题是:如何在预览视图中制作照片(用户点击捕获按钮,然后转到预览视图让用户预览)不是镜像,这个可能在 UIImagePickerController 中修复,我知道如何旋转照片,UIImageOrientation 中的枚举中的东西 [= =12=],我知道这是什么意思。

尝试 1:

我在用户点击 capture 按钮后获取照片,然后进入预览视图并使用我有镜像的照片覆盖默认照片(使用 cameraOverlayView), 我可以检测到用户点击 capture 按钮使用 NSNotificationCenter@"_UIImagePickerControllerUserDidCaptureItem", 但我找不到办法获取照片。

尝试 2:

我使用cameraViewTransform,但是当用户拍照(前置摄像头)时,当主页按钮在底部或顶部时,预览视图中的图像不是镜像, 但是当 Home 按钮在左侧或右侧时, phone 上的图像在用户点击 捕获 之前有一些问题, 尽管预览视图上的图像不是 mirror.use AVCaptureDeviceDidStartRunningNotification 通知。

- (void)cameraChanged:(NSNotification *)notification
{
  if(self.imagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceFront)
  {
     self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
     self.imagePickerController.cameraViewTransform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
     if (self.imagePickerController.cameraOverlayView) {
        NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is not nil");
    } else {
        NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is nil");
    }
    self.imagePickerController.cameraOverlayView.transform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
  } else {
    self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
  }
}

最后,我无法在UIImagePickerController中解决这个问题,但是我使用AVFoundationCoreMotion解决了这个问题,你可以看到AVCam

//init the motionManager
- (void)initializeMotionManager{
  motionManager = [[CMMotionManager alloc] init];
  motionManager.accelerometerUpdateInterval = .1;
  motionManager.gyroUpdateInterval = .1;

  [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
                                    withHandler:^(CMAccelerometerData  *accelerometerData, NSError *error) {
                                        if (!error) {
                                            [self outputAccelertionData:accelerometerData.acceleration];
                                        }
                                        else{
                                            NSLog_DEBUG(@"%@", error);
                                        }
                                    }];
  }

//detect the device orientation
- (void)outputAccelertionData:(CMAcceleration)acceleration{

  if (acceleration.x >= 0.75) {
      _orientationNew = UIInterfaceOrientationLandscapeLeft;
  }
  else if (acceleration.x <= -0.75) {
      _orientationNew = UIInterfaceOrientationLandscapeRight;
  }
  else if (acceleration.y <= -0.75) {
      _orientationNew = UIInterfaceOrientationPortrait;
  }
  else if (acceleration.y >= 0.75) {
      _orientationNew = UIInterfaceOrientationPortraitUpsideDown;
  }
  else {
      // Consider same as last time
      return;
  }

  if (_orientationNew == _orientationLast)
      return;

  _orientationLast = _orientationNew;
}