iPhone相机的光圈/快门卡在关闭位置

19

如标题所述,我正在开发的应用程序在进入后台后重新启动时会出现问题。

相机光圈或快门会被卡在关闭位置。有趣的是,您仍然可以拍照,但无法看到预览。一旦拍摄完成,它会在视图中正确显示。

如果应用程序完全关闭,那么在启动应用程序时就不会出现此问题。每次打开相机时都能正常工作,可以拍照和添加特效等。

以下是复现问题的确切步骤:

1)我打开应用程序,一切正常。

2)通过按下主页按钮或接收到电话等方式,应用程序进入后台。

3)当应用程序重新进入前台/重新打开并访问相机时,快门屏幕将显示并保持在卡住的位置。

4)唯一解决方法是关闭模态视图相机控制器并再次按下相机按钮。

我已经进行了一些研究,但没有找到答案。没有内存泄漏,并且我已经在instruments中检查了内存分配,没有异常情况。

希望有人能提供解决方案,感谢您的帮助。

提前致谢。


赏金点数的奖励比现金更具传统性! - jrturton
Jrturton,我很乐意提供赏金,但我认为我没有足够的声望来发放声望点数。我只在SO上问了几个问题。 - dana0550
你只需要50分-也就是两个被点赞并被接受的答案-你可以做到! - jrturton
这是我的问题,我检查了我的代码然后发现自定义相机没有调用dealloc,在修复它之后就没有再发生了。抱歉我的英语。 - user1041339
7个回答

12

我遇到了完全相同的问题,但是我缩小了一下范围——这只会在使用iOS 5时发生。在参考了其他关于内存的提示后,我在展示UIImagePickerController之前尽可能地释放了更多的内存,然后问题就不再出现了。


你是如何释放内存的?你是否释放了当前的图像?即使我打开相机但不拍照,问题仍然存在。我会按下相机按钮,然后取消它,关闭应用程序,重新打开它,再次按下相机按钮,快门仍然关闭。 - dana0550
1
我在调用presentModalViewController的视图控制器上释放了所有可能的图像和数据(从5.5兆减少到3.5兆),这个方法一度有效,但是当5.01版本发布后,问题又出现了。我一直保留uiimagepickercontroller,因为每次释放它时都会看到内存泄漏,但这是一个错误的做法——如果我只是在用户运行应用程序时不断重复使用它,并在他们退出时释放它,然后在下次用户运行应用程序并拍照时重新分配一个新的uiimagepickercontroller,这对我来说解决了问题。 - SWoo
2
我最终做的是你在最后一条评论中提到的。每次使用完毕后,我释放了imagePicker并重新分配了一个新的。这完全解决了问题。无需释放内存或其他任何操作。谢谢。 - dana0550
2
嗨,我有同样的问题,但是由于应用程序在ARC框架中,我无法释放ImagePicker,并且在代码中使用release或autorelese会出现错误。 - The iOSDev
你的方法也很好...我在相机上有叠加层,这样做起作用了。将其发布为答案,让每个人都能看到。在你解除选择器后立即释放imagePickerController以优化内存。 - tipycalFlow
我有同样的问题,我正在使用iOS6。 - Vineesh TP

6
我遇到了相同的问题,正在运行一个ARC项目。
在我的主屏幕上按摄像机按钮,imagePickerController将显示,取消imagePickerController。按Home键(关闭)应用程序。回到我的应用程序后,再次按摄像机按钮。在这种情况下,快门会显示并卡住。
以内存问题为主要线索,我发现我的覆盖视图对imagePickerController有一个强引用。我将其更改为弱引用,问题就解决了。

这对我也有用 - 我没有改变强/弱引用,因为我只有一个对ImagePickerController的引用,但是我添加了一行代码,以便在从相机获取图像后将引用明确设置为nil。看起来可以工作。 - Ben Wheeler

5

我认为当你在使用苹果应用程序拍照时遇到问题,那么你在那里也会遇到问题。是吗?如果是的话,你可以重新启动设备来解决问题。并且采用Dana的提示。


4
当应用进入后台模式时,您应该关闭相机,并在应用重新获得焦点时重新打开相机。

Logan,谢谢你的快速回复。我应该把我的问题表述得更清楚一些。该应用有两个视图:主页视图和相机视图。按下按钮即可访问相机视图。有趣的是,当应用程序在显示相机视图时关闭时,它重新启动并且快门打开。但是,当从主屏幕关闭应用程序时,问题就会发生。然后再次打开应用程序并按下相机按钮,相机模态视图将呈现为快门卡在关闭位置的状态。谢谢。 - dana0550

2

我曾经遇到了同样的问题,以下解决方案适用于我。 每当您以模态方式呈现UIImagePickerController时,请初始化并在使用后释放它。希望这对您也有用。

self.imagePickerController = [[UIImagePickerController alloc] init];
self.imagePickerController.delegate = self;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.imagePickerController.showsCameraControls = NO;

    self.imagePickerController.cameraOverlayView = cameraOverlayView;
} else {
    self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
}
[self presentViewController:imagePickerController animated:YES completion:^(void)
 {
   // If you want to do something extra
 }];

如果那个解决方案对您有用,您可以接受答案。谢谢。 - Ankit

1
以下两种组合对我有用:
  1. 将覆盖层的引用类型从“”更改为“

  2. 在取消或拍照后关闭imagePickerController后,将picker = nil


你真是个天才!我过去几个小时找到的解决方案都没有用。+1 - Unheilig

1

如果有人在使用MonoTouch时遇到释放图像选择器的相同行为问题,我必须调用dispose然后手动执行GC.Collect();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接