DIsmissing UIImagePickerController also makes parent disappear

I use the following code to show the UIImagePickerController to take a snapshot:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];    
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:imagePicker animated:YES completion:nil];

Note: self is a UIViewController, built-in inside the container, which itself takes part in the UINavigationController

And I also implemented the following methods:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];  
    [self.imgProfile setImage:image];   
    [self dismissViewControllerAnimated:YES completion:nil];    
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

When I either select a snapshot or cancel it, the UIImagePickerController leaves, but the main view disappears! With Fade to Black.

I only encode iOS7 in the iPad app if it has anything to do with it.

Here is a video that shows the problem. Sorry blur, but it is under the NDA.

http://www.youtube.com/watch?v=sIaPyRlIqyE

+4
7

iOS7, , , :

VC;

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];

[self addChildViewController:picker] ;

[picker didMoveToParentViewController:self] ;

[self.view addSubview:picker.view] ;

, - rejectModal, ;

[picker.view removeFromSuperview] ;
[picker removeFromParentViewController] ;

, , / - , .

+13

, () :

<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imageView.image = chosenImage;

[picker dismissViewControllerAnimated:YES completion:NULL];

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

[picker dismissViewControllerAnimated:YES completion:NULL];

}
+3

.modalPresentationStyle .OverCurrentContext .OverFullScreen:

:

viewController.definesPresentationContext = true
imagePicker.modalPresentationStyle = .CurrentContext OR .FullScreen

, : false then .OverCurrentContext, true, .CurrentContext

.definesPresentationContext false, .

. .

+3

UIPopOver, iPad, , .

#pragma mark
#pragma mark - Image Picker
-(IBAction)onClickTakePhoto:(id)sender
{
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {

        imagePickerController = [[UIImagePickerController alloc] init];        
        imagePickerController.delegate = self;
        imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePickerController.mediaTypes = [UIImagePickerController  availableMediaTypesForSourceType:imagePickerController.sourceType];
        imagePickerController.allowsEditing = YES;

        if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
            [self presentViewController:imagePickerController animated:YES completion:nil];
        } else {
            [self presentModalViewController:imagePickerController animated:YES];
        }        
        [imagePickerController release];
    }
}

-(IBAction)onClickChooseFromLibrary:(id)sender
{
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    {
        imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagePickerController.delegate = self;
        imagePickerController.allowsEditing = YES;
        imagePickerController.mediaTypes = [UIImagePickerController  availableMediaTypesForSourceType:imagePickerController.sourceType];
        popoverController= [[UIPopoverController alloc]
                        initWithContentViewController:imagePickerController];
        [popoverController presentPopoverFromRect:btnLibrary.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    }
}

#pragma mark
#pragma mark - UIImagePickerDelegate
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{    
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])   
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }
    [popoverController dismissPopoverAnimated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{    
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) 
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }

    [popoverController dismissPopoverAnimated:YES];
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    [userImage setLocalImage:image];
}
0

UIImagePickerController , VC :

- viewWillAppear
- viewDidAppear
- viewDidLayoutSubviews
a bunch of other methods having to do with basic VC lifecycle.

VC, presentViewController:. VC . -viewDidLayoutSubviews. , .

, , , , -viewDidLayoutSubviews rootVC, childVC .

, , , , VC ( - Bool setupHasAlreadyHappenedOnce , ).

0

, , UIImagePickerController UIContainerView.

, UIImagePickerController UIContainerView ( ).

UIImagePickerController PARENT View UIContainerView, .

0

UIImagePickerController " ", UINavigationControllerDelegate. . .

@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

, , self UINavigationControllerDelegate , .

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    NSMutableArray *stack = [navigationController.viewControllers mutableCopy];
    if (stack.count >= 2) {
        [stack removeObjectAtIndex:(stack.count-2)];
    }
    navigationController.viewControllers = [stack copy];
    navigationController.delegate = nil;
}

Well, I did, and it cost me a lot of time to find out. My situation may not be commonplace. This is just for reference.

0
source

All Articles