我有一个使用 sourceType 相机调用的 UIImagePickerController,80% 的时间我得到黑色预览。如果我等待,假设大约 30 秒,我会得到一个很好的预览,并且在大约 50% 的时间内它会很好,然后它可能会再次中断。
所讨论的图像与此非常相似。iDevice 相机显示黑色而不是预览 https://stackoverflow.com/questions/16746839/idevice-camera-shows-black-instead-of-preview
其他人暗示 GCD 可能会导致相机出现一些问题,并且在加载图像选择器时更新 UI 会破坏它。为此,我在每个调用主线程的 GCD 块上加了一个锁。
这是旋转以模拟活动指示器的图像的示例。
-(void)animateLoadingImage {
if (isMainThreadBlocked) {
return;
}
self.radians += M_PI_4 / 2;
[UIView beginAnimations:@"progress rotation" context:nil];
[UIView setAnimationDuration:.1];
self.loadingImageView.transform = CGAffineTransformMakeRotation(self.radians);
[UIView commitAnimations];
}
PS:对尚未渲染的视图进行快照会导致空快照。确保您的视图在快照之前或屏幕更新后的快照之前至少已渲染一次。
当我尝试打开选择器控制器时,它总是显示,但即使相机正确显示预览,它也会显示它。我不认为错误就在这里,但这也让我很烦恼。
在我最近的一个项目中,我遇到了同样(或类似)的问题,即在 iOS7 (iPad) 上使用 UIImagePickerController 时相机预览显示黑屏。
我发现 GCD 本身并不是问题。当您尝试在主线程以外的线程中使用 UIKit 框架中的任何内容(作为 NSOperation 的一部分)时,就会出现问题。
首先,我首先要说的是,我很清楚你一开始就不应该这样做。然而,就我的具体情况而言,我别无选择。因为我认为其他人很可能会因为同样的原因而经历同样奇怪的 UIImagePickerController 相机行为,所以我编写了一些非常简单的示例代码来解释发生了什么。
你可以在这里找到它:https://github.com/idamediafoundry/CameraTest https://github.com/idamediafoundry/CameraTest
ViewController 显示 2 个简单的按钮。一个调用 UIImagePickerController,显示相机,另一个启动一些 GCD 操作来执行一项简单的任务。如果你只是打开相机,一切正常。如果先开始操作,再打开相机,会出现预览黑屏的问题。
再次强调,除了主线程之外,您不应该在任何其他地方调用 UIKit。但我认为,违反此规则会导致相机在主线程中作为完全不同流程的一部分打开时出现故障,这并不正常,对吗?
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)