UIImagePickerController前置摄像头在预览视图

时间:2015-06-04 12:53:49

标签: ios objective-c uiimagepickercontroller

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

尝试1:

我在用户点击捕获按钮之后拍摄照片,然后转到预览视图并使用我有镜像的照片来覆盖默认照片(使用cameraOverlayView),我可以通过 @“_ UIImagePickerControllerUserDidCaptureItem”检测用户点击捕获按钮使用NSNotificationCenter,但我发现无法获取照片。

尝试2:

我使用cameraViewTransform,但当用户在底部或顶部的 Home 按钮上拍摄照片(前置摄像头)时,预览视图上的图像不是镜像,而是{左侧或右侧的{1}}按钮,用户点击捕获之前手机上的图像有问题,但预览视图上的图像不是mirror.use Home通知。

AVCaptureDeviceDidStartRunningNotification

1 个答案:

答案 0 :(得分:2)

最后,我无法在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;
}