iOS 7 UIImagePicker preview black screen

前端 未结 3 1631
独厮守ぢ
独厮守ぢ 2020-12-01 08:09

When i try to load camera from my code, camera preview is black. If I wait for 10-20 seconds it will show real camera preview. I found several questions and some of them sug

相关标签:
3条回答
  • 2020-12-01 08:18

    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];
    
    0 讨论(0)
  • 2020-12-01 08:33

    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

    0 讨论(0)
  • 2020-12-01 08:39

    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;
    }
    
    0 讨论(0)
提交回复
热议问题