简体   繁体   中英

Black screen appears, randomly after taking an image and tapping 'USE' in the UIImagePickerController

I have an app that's almost done and now while it was under QA, the QA engineer came across a random issue in which a black screen appears after tapping on USE in UIImagePickerController view. Further in didFinishPickingMediaWithInfo the image is being saved for future refrencing and is being shown in an UIImageView , I am also using camera overlay for adding a button to the UIImagePickerView and the max memory usage of the app doen't goes beyond 13 MB . The issue is not arising when switching to Camera roll mode from capture mode. Also in the same view iADs are being presented. Underneath is the code, to which the issue may concern, also images are being attached to get an idea of the issue. Any help would be greatly appreciated.

Thanks in advance.

图像选择器控制器

这张图片是正确的,现在应该如何看待

随着这个屏幕的使用,随着这个屏幕的出现,即使出现在其他设备上,也可能出现正确的屏幕[屏幕数量2]。

(void) launchCamera 
{
     // Set up the camera\
     CustomCameraView *cameraController   = [[CustomCameraView alloc] init];  
     cameraController.sourceType          = UIImagePickerControllerSourceTypeCamera;
     cameraController.delegate            = self; 
     cameraController.showsCameraControls = YES;
     cameraController.navigationBarHidden = YES;
     cameraController.toolbarHidden       = YES;

     // overlay on top of camera lens view

     UIButton *cameraRoll = [[UIButton alloc] initWithFrame:CGRectMake(15, 380, 40, 40)];
     [cameraRoll setAlpha:0.0f];
     [cameraRoll setBackgroundImage:[UIImage imageNamed:@"CamerRoll_New"] forState:UIControlStateNormal];
     [cameraRoll addTarget:self action:@selector(switchToCameraRoll) forControlEvents:UIControlEventTouchUpInside];
     cameraController.cameraOverlayView = cameraRoll;

     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDelay:1.5f];
     cameraRoll.alpha = 1.0f;
     [UIView commitAnimations];

     [self presentModalViewController:cameraController animated:YES];

 }

-(void)switchToCameraRoll
{
    DLog(@"Camera Roll");  
    [self dismissViewControllerAnimated:NO completion:^(void){ [self photoSourcePhotoAlbum];}];
}

-(void) photoSourcePhotoAlbum
{
     UIImagePickerController * picker = [[UIImagePickerController alloc] init];
     picker.delegate = self;
     picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
     [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{    
    [self.view addSubview:progressView];
    timer = [NSTimer scheduledTimerWithTimeInterval:.017 target:self selector:@selector(progressChange) userInfo:nil repeats:YES];
    [picker dismissModalViewControllerAnimated:YES];
    [self performSelectorInBackground:@selector(saveImage:) withObject:info];
    [self performSelector:@selector(navigateToEditView) withObject:nil afterDelay:2.1];
}

-(void)navigateToEditView
{
    [self performSegueWithIdentifier:@"presentRDetailModalViewController" sender:self];   
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    if (picker.sourceType == UIImagePickerControllerSourceTypeSavedPhotosAlbum) 
    {
        [picker dismissViewControllerAnimated:NO completion:^(void){ [self photoSourceCamera];}];
    }
    else 
    {
        [picker dismissModalViewControllerAnimated:YES]; 
    }
}

-(void)saveImage:(NSDictionary *)info
{    
    NSString *imageName = [[[DataStaging dataStaging] getGUID] stringByAppendingString:@".jpg"];
    rImageName = imageName;
    UIImage *rImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    //Compress image

    [[FileOperations fileOperations] PersistData:UIImageJPEGRepresentation(rImage, 0.4) name:imageName];
    DLog(@"%@",[[FileOperations fileOperations] fetchPath:imageName]);

    //Actual image taken

    [[self rImageView] setImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]];

    if ([rImageName length] == 0) 
    {
        [[self rDetails] setHidden:YES];
        [[self trashRImage]   setHidden:YES];
    }
    else 
    {
        [[self rDetails] setHidden:NO];

        [[self trashRImage]   setHidden:NO];
    }

    [progressView removeFromSuperview];
  }
}

Make sure you don't call presentModalViewController:animated: twice before dismissModalViewControllerAnimated: It helped in my case.

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    if (_imagePickerController!=nil || _imagePopoverController!=nil) {
        return;
    }
    _imagePickerController = [[[UIImagePickerController alloc] init] autorelease];
    _imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
    _imagePickerController.sourceType = sourceType;
    _imagePickerController.delegate = self;
    switch (sourceType) {
        case UIImagePickerControllerSourceTypeCamera:
            _imagePickerController.showsCameraControls = YES;
            [self presentViewController:_imagePickerController animated:YES completion:nil];
            break;
        default:
            _imagePopoverController = [[UIPopoverController alloc] initWithContentViewController:_imagePickerController];
            _imagePopoverController.delegate = self;
            CGRect rect = [[UIScreen mainScreen] bounds];
            rect.origin.y = rect.size.height - 70.0;
            rect.size.height -= rect.origin.y;
            [_imagePopoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
            break;
    }
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
    [_imagePopoverController dismissPopoverAnimated:YES];
    _imagePopoverController = nil;
    [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
    _imagePickerController = nil;
}

- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImageWriteToSavedPhotosAlbum([info objectForKey:UIImagePickerControllerOriginalImage],nil,nil,nil);
    _currentImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    [_imagePopoverController dismissPopoverAnimated:YES];
    _imagePopoverController = nil;
    [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
    _imagePickerController = nil;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM