iOS 7 UIImagePicker preview black screen iOS 7 UIImagePicker preview black screen ios ios

iOS 7 UIImagePicker preview black screen


About 5 months ago my team discovered a memory leak with UIImageViewController in iOS7. Each instantiation slowed down the app exponentially (i.e. first alloc-init had a 1 second delay, second had a 2 second delay, third had a 5 second delay). Eventually, we were having 30-60 delays (similar to what you're experiencing).

We resolved the issue by subclassing UIImagePickerController and making it a Singleton. That way it was only ever initialized once. Now our delay is minimal and we avoid the leak. If subclassing isn't an option, try a class property in your viewController and just lazy load it like so.

-(UIImagePickerController *)imagePicker{    if(!_imagePicker){        _imagePicker = [[UIImagePickerController alloc]init];        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;    }    return _imagePicker;}

Then you can just call it later like:

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


Had this myself - it happens if something is running on the main dispatch thread - are you resizing images by any chance?

It puts the preview onto the main thread and if something is using it, you get a black screen. It's a bug and the workaround is to either take over the main thread or to disable the photo picker until the queue is free


This Should work for you:

    - (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;}