UIImagePickerController的cameraViewTransform忽略了iOS 10 beta上的“缩放”和“翻译”

我一直在使用下面的代码来缩放我的UIImagePickerController的实时预览来填充整个屏幕。 这工作完美到现在。 在几天之前,我在iPhone 5上安装了iOS 10 beta 7,并且不再扩展。 我可以在UIImagePickerController视图的底部看到黑色补丁。 看起来像cameraViewTransform忽略了CGAffineTransformMakeScaleCGAffineTransformMakeTranslation调用。

这是我如何启动我的相机控制器。 我已经设置了“允许编辑”和“showsCameraControls”为“否”,以提供我自己的自定义覆盖视图。

 objImagePickerController =[[UIImagePickerController alloc] init]; objImagePickerController.delegate = self; objImagePickerController.sourceType =UIImagePickerControllerSourceTypeCamera; objImagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; objImagePickerController.allowsEditing = NO; objImagePickerController.showsCameraControls= NO; 

这是我用来缩放相机实时预览。

 CGSize screenSize = [[UIScreen mainScreen] bounds].size; float screenHeight= MAX(screenSize.height, screenSize.width); float screenWidth= MIN(screenSize.height, screenSize.width); float cameraAspectRatio = 4.0 / 3.0; float imageWidth = floorf(screenWidth * cameraAspectRatio); float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0; objImagePickerController.cameraViewTransform= CGAffineTransformMakeScale(scale, scale); 

这是我如何添加相机视图作为一个子视图,而不是传统的模式演示方法,以适应我自己的要求。

  [[[UIApplication sharedApplication] keyWindow]addSubview:objImagePickerController.view]; 

从iOS 5 beta 8上运行的iPhone 5s截图

在这里输入图像说明

在iOS 8.2上运行的iPhone 5s截图

在这里输入图像说明

从上面的截图可以cameraViewTransformcameraViewTransform不尊重iOS 10 beta中的CGAffineTransformMakeScale

其他人是否面临这个问题? 这是一个非常奇怪的行为出现在iOS 10 beta操作系统。 我无法为此find解决方法。 请指教。

注意:: objImagePickerController是UIImagePickerController的一个实例。

奇怪的是,它只允许我们在演示完成进行转换。

例:

 self.presentViewController( self.imagePicker, animated: true, completion: { let screenSize = UIScreen.mainScreen().bounds.size let ratio: CGFloat = 4.0 / 3.0 let cameraHeight: CGFloat = screenSize.width * ratio let scale: CGFloat = screenSize.height / cameraHeight self.imagePicker.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0) self.imagePicker.cameraViewTransform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, scale, scale) } ) 

此代码将转换相机视图以匹配屏幕大小。

请注意,这是一个解决方法。 它的工作原理,但用户会看到它在演示时resize。

如此处回答,此问题已在iOS 10.2中得到解决,您可以在再次呈现相机之前使用cameraViewTransform属性。

我已经解决了通过延迟相机设置cameraViewTransform AVCaptureSessionDidStartRunningNotification引发:

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraIsReadyNotification:) name:AVCaptureSessionDidStartRunningNotification object:nil]; 

 - (void)cameraIsReadyNotification:(NSNotification *)notification { dispatch_async(dispatch_get_main_queue(), ^{ float scale = ceilf((screenHeight / imageWidth) * 10.0) / 10.0; objImagePickerController.cameraViewTransform=CGAffineTransformMakeScale(scale, scale); }); } 

我之前在IOS 9.3中也遇到了同样的问题。 这是我使用的代码

 //transform values for full screen support #define CAMERA_TRANSFORM_X 1 #define CAMERA_TRANSFORM_Y 1.12412 if (IS_IPAD) CGAffineTransformScale(objImagePickerController.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y); else if (IS_IPHONE_5_Land||IS_IPHONE_4_Land||IS_IPHONE_6_Land||IS_IPHONE_6_PLUS_Land) { objImagePickerController.cameraViewTransform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2); } 

希望这可以帮助

我在增强现实应用程序中遇到了同样的问题,并最终通过使用AVFoundation框架而不是UIImagePickerController来解决此问题。 看来cameraViewTransform不再适用于iOS 10。

下面的代码为我工作。 将函数添加到您的UIViewController子类并调用它。

 - (BOOL) initCamera { AVCaptureSession *captureSesion = [[AVCaptureSession alloc] init]; if ([captureSesion canSetSessionPreset:AVCaptureSessionPresetHigh]) { [captureSesion setSessionPreset:AVCaptureSessionPresetHigh]; } else { return false; } AVCaptureDevice *camera = nil; NSArray<AVCaptureDevice*>* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; // Select back camera for (AVCaptureDevice *device in devices) { if ([device position]==AVCaptureDevicePositionBack) { camera = device; break; } } if (camera == nil) { // Back camera not found. return false; } AVCaptureStillImageOutput *imageOutput = [[AVCaptureStillImageOutput alloc]init]; [imageOutput setOutputSettings: @{AVVideoCodecKey: AVVideoCodecJPEG}]; AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:camera error: nil]; if (![captureSesion canAddInput:deviceInput] || ![captureSesion canAddOutput:imageOutput]) { return false; } [captureSesion addInput:deviceInput]; [captureSesion addOutput:imageOutput]; AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:captureSesion]; // "Aspect Fill" is suitable for fullscreen camera. layer.videoGravity = AVLayerVideoGravityResizeAspectFill; layer.frame = self.view.bounds; layer.connection.videoOrientation = AVCaptureVideoOrientationPortrait; [self.view.layer addSublayer:layer]; [captureSesion startRunning]; return true; } 

最重要的是使用AVLayerVideoGravityResizeAspectFill 。 使用此configuration,摄像机视图将保持原始高宽比的容器视图。

不要忘记导入框架:)

 #import <AVFoundation/AVFoundation.h> 

corris dans la版本ios 10.2问题在ios 10.2版本中解决