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

Ras*_*ick 11 objective-c uiimagepickercontroller ios ios10 xcode8-beta6

我一直在使用下面的代码来扩展我的UIImagePickerController的实时预览以填充整个屏幕.到目前为止,这完美地运作 在几天之前,我在iPhone 5上安装了iOS 10 beta 7,它不再扩展.我可以在UIImagePickerController的视图底部看到黑色补丁.似乎cameraViewTransform是在忽略CGAffineTransformMakeScaleCGAffineTransformMakeTranslation调用.

这就是我启动相机控制器的方式.我已将"allowsEditing"和"showsCameraControls"都设置为"NO",以便提供我自己的自定义叠加视图.

objImagePickerController =[[UIImagePickerController alloc] init];

objImagePickerController.delegate = self;
objImagePickerController.sourceType =UIImagePickerControllerSourceTypeCamera;
objImagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
objImagePickerController.allowsEditing = NO;
objImagePickerController.showsCameraControls= NO;
Run Code Online (Sandbox Code Playgroud)

这是我用来缩放相机实时预览的内容.

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);
Run Code Online (Sandbox Code Playgroud)

这就是我将摄像机视图添加为子视图而不是传统的模态演示方法的方法,以满足我自己的要求.

 [[[UIApplication sharedApplication] keyWindow]addSubview:objImagePickerController.view];
Run Code Online (Sandbox Code Playgroud)

来自iOS 5 beta 8上运行的iPhone 5s的屏幕截图

在此输入图像描述

来自iOS 5上运行的iPhone 5s的屏幕截图

在此输入图像描述

从上面的截图中可以看出,cameraViewTransform它不符合CGAffineTransformMakeScaleiOS 10测试版.

有没有人面对这个问题?这是iOS 10 beta OS中出现的一种非常奇怪的行为.我无法找到解决方法.请指教.

NOTE :: objImagePickerController是UIImagePickerController的一个实例.

Tho*_*oom 7

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

例:

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)
        }
    )
Run Code Online (Sandbox Code Playgroud)

此代码将转换摄像机视图以匹配屏幕大小.

请注意,这是一种解决方法.它有效,但用户会看到它在演示时调整大小.


Han*_*hel 5

如此处所述,此问题已在iOS 10.2中得到修复,您可以cameraViewTransform在再次显示相机之前使用该属性.

  • 适用于iOS 10.2.谢谢. (2认同)

gur*_*eep 1

我之前在 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);
        }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 感谢您的回答。但是,对我来说,我现有的代码在最新的 9.xx iOS 版本之前都可以正常工作。只有 iOS 10 才有问题。我尝试了你的代码,但这对我也没有帮助。 (2认同)