UIImagePickerController cameraViewTransform在iOS 4中的行为有所不同

时间:2010-08-04 17:13:23

标签: iphone uiview camera uiimagepickercontroller transform

我将iPhone和SDK升级到iOS 4.0.1,现在我的应用程序运行方式与在iOS 3.x中运行的方式不同。

我的应用程序使用UIImagePickerController和自定义cameraOverlayView(我将在这篇文章中予以抑制)。重点是我需要在全屏模式下看到iphone相机。为了直接解决这个问题,我会提供一些代码和截图来解释发生了什么。

我使用名为“CameraTransform”的XCode模板项目创建了一个基于视图的应用程序,所以我有两个类:CameraTransformAppDelegateCameraTransformViewController,好吧!在CameraTransformViewController的{​​{1}}方法中,我输入了以下代码:

viewDidAppear

用/ i运行项目:

  • - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIImagePickerController* picker = [[UIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.delegate = self; //[self configurePicker_FirstAttempt:picker]; Use this! //[self configurePicker_SecondAttempt:picker]; Use this too! [self presentModalViewController:picker animated:YES]; } - (void)configurePicker_FirstAttempt:(UIImagePickerController*) picker { picker.showsCameraControls = NO; picker.navigationBarHidden = YES; // not needed (use defaults) //picker.toolbarHidden = YES; //picker.wantsFullScreenLayout = YES; } - (void)configurePicker_SecondAttempt:(UIImagePickerController*) picker { // Transform values for full screen support CGFloat cameraTransformX = 1.0; CGFloat cameraTransformY = 1.12412; picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, cameraTransformX, cameraTransformY); } configurePicker_FirstAttempt方法调用已注释:defaultPicker.png
  • configurePicker_SecondAttempt方法调用评论:configurePicker_FirstAttempt.png
  • configurePicker_SecondAttemptconfigurePicker_FirstAttempt方法调用取消注释:configurePicker_SecondAttempt.png

注:

  1. 在iOS 3.x中,我使用了第三种方法(两种方法都没有注释)来配置选择器,它在全屏模式下显示,底部没有“黑条”。
  2. 我检查了configurePicker_SecondAttempt原始值(在缩放之前)并将其设置为Identity(按预期方式)。
  3. picker.cameraViewTransform设置为屏幕边界(0.0,0.0,320.0,480.0)
  4. 我尝试将翻译连接到picker.view.frame(缩放后),如下所示:picker.cameraViewTransform我意识到隐藏了一些“相机视图”的部分(也许是原点不是0.0,0.0),所以我在屏幕上得到了更多的“相机视图”。
  5. 看起来在新的SDK中,UIImagePickerController已经以某种方式发生了变化,也许相机控件的大小也不同。

    有人有这个问题吗?

4 个答案:

答案 0 :(得分:14)

  

ios 4.0 Magic number 1936/220 = 6.05,2 2592 / 6.05 = 428,480-428 = 52 52 /(428/2)= 0.24299 + 1 = 1.24299

     

ios 3.0 Magic number 1536/320 = 4.8 2048 / 4.8 = 427 480-427 = 53 53/427 = 0.121412 + 1 = 1.12412

这是关系cameraresolution-screenresolution

对于iOS 3.0,从顶部应用cameraViewTransform,因此您必须使用所有高度。但是在iOS4中,它是从框架的中心应用的,所以你必须使用一半的高度。而且你必须向下移动框架(52/2)以使框架保持在中心位置。

答案 1 :(得分:4)

我不确定iOS 3.0,但对于iOS 4.0,cameraViewTransform是从帧的中心应用的。您可以先应用转换变换来验证这一点。

CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 27.0);
imagePickerController.cameraViewTransform = translate;

您可以看到这会将视图移动到中心。接下来应用缩放变换,您将看到它填满了屏幕。

CGAffineTransform scale = CGAffineTransformScale(translate, 1.125, 1.125);
imagePickerController.cameraViewTransform = scale;

如果缩放变换仅适用于iOS 3和公司,那么变换将应用于不同的锚点,如中心顶部。您应始终在两个方向上线性缩放,否则图像将会歪斜。

答案 2 :(得分:3)

CGAffineTransformMakeTranslation不会直接在cameraViewTransform上运行。因此,使用CGAffineTransformScale来应用CGAffineTransformMakeTranslation。

float yOffset = 44.0;
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, yOffset);
self.cameraFeed.cameraViewTransform = CGAffineTransformScale(translate, 1, 1);

答案 3 :(得分:2)

我发现iPhone 4的新比例变换为~1.25(而不是~1.12)。

我花了几分钟试图找出这些神奇数字的来源 - 我假设屏幕分辨率和屏幕分辨率之间存在某种关系。相机分辨率,但我无法匆忙解决......

如果有人,请发一个答案 - 我讨厌魔术数字。

仅供参考,iPhone 4的相机分辨率为2592x1936,而iPhone 3GS的相机分辨率为2048x1536。