在拍摄图像并在UIImagePickerController中点击“USE”后,会随机出现黑屏

时间:2012-07-16 12:31:16

标签: iphone ios uiimage uiimagepickercontroller core-image

我有一个应用程序已经差不多完成了,现在在QA下,QA工程师遇到了一个随机问题,在UIImagePickerController视图中点击USE后会出现黑屏。此外,在didFinishPickingMediaWithInfo中,图片正在保存以供将来重新显示,并且正在UIImageView中显示,我还使用相机覆盖来为UIImagePickerView添加按钮以及最大内存使用量该应用程序不超过 13 MB 。从捕获模式切换到相机胶卷模式时不会出现此问题。同样在同一视图iADs中也有呈现。下面是问题可能涉及的代码,也附加了图像以了解问题。任何帮助将不胜感激。

提前致谢。

Image Picker Controller

THIS IMAGE IS CORRECT, THIS IS HOW THE VIEW SHOULD BE PRESENTED

RANDOMLY THIS SCREEN APPEARS AFTER TAPPING ON USE, THOUGH ON NAVIAGTING TO AND FRO TO OTHER TABS THE CORRECT SCREEN[THE SCREEN NUMBER 2] DOES APPEARS.

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

1 个答案:

答案 0 :(得分:0)

确保在dismissModalViewControllerAnimated之前不调用presentModalViewController:animated:两次: 它对我有帮助。

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