DIsmissing UIImagePickerController也使父级消失

Jan*_*Jan 4 objective-c uiimagepickercontroller ipad ios ios7

我正在使用以下代码来显示UIImagePickerController来拍照:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];    
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:imagePicker animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

注意:self是嵌入在Container视图中的UIViewController,它本身也参与了UINavigationController

我还实现了以下方法:

-(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];
}
Run Code Online (Sandbox Code Playgroud)

当我选择拍照或取消它时,UIImagePickerController消失,但主视图也消失了!随着淡化到黑色.

我在仅限iPad的应用程序上编写iOS7代码,以防它与它有任何关系.

这是一个显示问题的视频.请原谅模糊,但它是在NDA下.

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

小智 14

我在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] ;
Run Code Online (Sandbox Code Playgroud)

然后,当处理选择器委托 - 而不是dismissModal时,使用;

[picker.view removeFromSuperview] ;
[picker removeFromParentViewController] ;
Run Code Online (Sandbox Code Playgroud)

所有你失去的是动画现在/解雇 - 除此之外,一切都应该是好的.


g.R*_*ido 5

尝试将图像选择器设置.modalPresentationStyle.OverCurrentContext.OverFullScreen

交替:

viewController.definesPresentationContext = true
imagePicker.modalPresentationStyle = .CurrentContext OR .FullScreen
Run Code Online (Sandbox Code Playgroud)

要点是这两个属性之间的关系需要这样保留: if falsethen .OverCurrentContext, if truethen.CurrentContext

就我而言,我的视图控制器.definesPresentationContext默认为 false,所以我使用了第一个选项。

请参阅文档以获得一些见解。


D-e*_*per 0

建议您在像这样打开 iPad 相机胶卷时使用 UIPopOver,所以尝试一下希望它对您有所帮助。

#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];
}
Run Code Online (Sandbox Code Playgroud)