iOS 7 UIImagePicker预览黑屏

iOS 7 UIImagePicker预览黑屏,ios,objective-c,uiimagepickercontroller,Ios,Objective C,Uiimagepickercontroller,当我尝试从代码加载相机时,相机预览为黑色。如果我等待10-20秒,它将显示真正的相机预览。我发现了几个问题,其中一些问题建议在后台运行其他代码应该是原因。然而,我没有任何代码在后台运行。 我该如何解决这个问题 这是我运行照相机的代码 UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init]; photoPicker.delegate = self; photoPicker.sourceType =

当我尝试从代码加载相机时,相机预览为黑色。如果我等待10-20秒,它将显示真正的相机预览。我发现了几个问题,其中一些问题建议在后台运行其他代码应该是原因。然而,我没有任何代码在后台运行。 我该如何解决这个问题

这是我运行照相机的代码

UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];

photoPicker.delegate = self;
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:photoPicker animated:YES completion:NULL];

我自己也有过这种情况——如果在主调度线程上运行某个东西,就会发生这种情况——您是否有机会调整图像的大小


它将预览放在主线程上,如果有人在使用它,就会出现一个黑屏。这是一个bug,解决方法是接管主线程或禁用照片选择器,直到队列空闲为止

大约5个月前,我的团队在iOS7中发现UIImageViewController内存泄漏。每次实例化都会以指数方式减慢应用程序的速度(即,第一个alloc init有1秒的延迟,第二个有2秒的延迟,第三个有5秒的延迟)。最终,我们遇到了30-60次延迟(与您所经历的类似)

我们通过将UIImagePickerController子类化并使其成为单例来解决这个问题。这样,它只初始化过一次。现在我们的延迟最小,我们避免了泄漏。如果子类化不是一个选项,请在viewController中尝试类属性,然后像这样延迟加载它

-(UIImagePickerController *)imagePicker{
    if(!_imagePicker){
        _imagePicker = [[UIImagePickerController alloc]init];
        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }
    return _imagePicker;
}
然后您可以稍后再调用它,如:

[self presentViewController:self.imagePicker animated:YES completion:nil];

这应该适合您:

    - (void)cameraViewPickerController:(UIImagePickerController *)picker
{
    [self startCameraControllerFromViewController: picker
                                    usingDelegate: self];
}


- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller
                                   usingDelegate: (id <UIImagePickerControllerDelegate,
                                                   UINavigationControllerDelegate>) delegate {

    if (([UIImagePickerController isSourceTypeAvailable:
          UIImagePickerControllerSourceTypeCamera] == NO)
        || (delegate == nil)
        || (controller == nil))
        return NO;


    UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

    // Displays a control that allows the user to choose movie capture
    cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, (NSString *) kUTTypeMovie,nil];

    // Hides the controls for moving & scaling pictures, or for
    // trimming movies. To instead show the controls, use YES.
    cameraUI.allowsEditing = NO;

    cameraUI.delegate = delegate;

    [controller presentViewController:cameraUI animated:YES completion:nil];
    return YES;
}
-(无效)cameraViewPickerController:(UIImagePickerController*)选择器
{
[自启动MeracontrollerFromViewController:选择器
使用代理:self];
}
-(BOOL)startCameraControllerFromViewController:(UIViewController*)控制器
usingDelegate:(id)delegate{
如果(([UIImagePickerController]资源类型可用:
UIImagePickerControllerSourceTypeCamera]==否)
||(委托==零)
||(控制器==零)
返回否;
UIImagePickerController*cameraUI=[[UIImagePickerController alloc]init];
cameraUI.sourceType=UIImagePickerControllerSourceTypeCamera;
//显示允许用户选择电影捕获的控件
cameraUI.mediaTypes=[[NSArray alloc]initWithObjects:(NSString*)kUTTypeImage,(NSString*)kUTTypeMovie,nil];
//隐藏用于移动和缩放图片的控件,或用于
//剪辑电影。若要显示控件,请使用“是”。
cameraUI.allowsEditing=否;
cameraUI.delegate=代表;
[controller presentViewController:cameraUI动画:是完成:无];
返回YES;
}

这段代码看起来不错-我建议尝试一下:
dispatch\u async(dispatch\u get\u main\u queue(),^{})并查看是否有任何更改。如果它工作正常,这意味着您正在后台运行代码,您还可以在发布的任何行上设置断点,并在点击断点时查看Xcode侧栏,查看您正在运行的线程。@Undo我已经尝试了您的代码,但没有任何更改。欢迎使用iOS 7的UIImagePicker。完全没有明显的原因,有时(通常)你会看到一个黑色的预览屏幕。有时它会在一段时间后消失,你会得到相机预览,有时它不会。请注意,完全相同的代码在iOS 6上无缝工作。我花了好几个小时试图弄明白这一点。这个问题值得认真关注!这让我们开发者看起来好像不知道如何编程,而编程完全掌握在苹果手中。我正在考虑用较低级别的API编写自己的图像捕获。是的,当我拍照时,它显示得很好。我也尝试过实现AVFoundation摄像头,它还需要10-20秒才能显示预览。我不敢相信这个问题没有解决方案。谢谢@eckyzero的回答。我有一种感觉,它减少了一些时间,我必须等待黑屏删除,但它还没有完全解决。这似乎是一个更具响应性的代码这不是一个完整的修复,但它肯定有帮助-苹果公司在下一次iOS 7更新的补丁列表中把这个问题放在首位,这并不是一件太过分的事。让应用程序的这些关键功能快速高效地工作真的很重要!此外,这不是iOS 7中UIImagePickerController的唯一错误。我很高兴能帮上一点忙,我完全同意你的看法。你知道是否有人向苹果提交了一个bug吗?在这个视图中,我使用的是UICollectionView,是的,我也在调整图像的大小。我已经检查,我的UIImagePicker代码正在主线程上运行。你有什么想法吗?调整图片大小可能有什么问题吗?我自己也在寻找解决方案-目前看来这是一个内部错误。我似乎无法在另一个线程上调整图像大小或同时使用AVAssetWriter:非常烦人我面临类似的问题(由于内存问题而关闭),但只有在调整捕获图像的大小时才可以。这对我意味着什么?这里没有图像大小调整?我也解决了这个问题。我有一个问题的背景线程。上传图像的任务,我把它放在背景线程。我把它放回主线程,工作正常。