更改通过 UIPopOver (iPad) 呈现的 UIImagePicker 的大小

Posted

技术标签:

【中文标题】更改通过 UIPopOver (iPad) 呈现的 UIImagePicker 的大小【英文标题】:Changing size of UIImagePicker presented via UIPopOver (iPad) 【发布时间】:2011-12-07 15:39:16 【问题描述】:

我正在尝试更改通过 UIPopOver 呈现的 UIImagePicker 的大小。代码如下所示。问题是 PopOver 大小无法正确显示 - 它会以正确的大小短暂闪烁,然后动画到通常的默认大小。

谁能告诉我如何更改弹出框的大小?

- (void)showImagePickerForPhotoLibrary 
    NSLog(@"Picker");
    imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePickerController.contentSizeForViewInPopover = CGSizeMake(768, 1000);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        Class cls = NSClassFromString(@"UIPopoverController");
        if (cls != nil) 
            popoverController = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];
            //popoverController.popoverContentSize = CGSizeMake(768, 1000);
            [popoverController presentPopoverFromRect:selectedRect inView:self.view permittedArrowDirections:4 animated:YES];
        
    
    else 
        [app.mainViewController presentModalViewController:imagePickerController animated:YES];
       

【问题讨论】:

【参考方案1】:

我不确定这是最优雅的解决方案,但它似乎对我来说很好:

您可以将 UIImagePickerController 的视图嵌入到“容器”UIViewController 的视图中。

- (void)showImagePickerForPhotoLibrary 
NSLog(@"Picker");
    imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    UIViewController *containerController = [[UIViewController alloc] init];
    containerController.contentSizeForViewInPopover = CGSizeMake(768, 1000);

    [containerController.view addSubview:imagePickerController.view];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        Class cls = NSClassFromString(@"UIPopoverController");
        if (cls != nil) 
            popoverController = [[UIPopoverController alloc] initWithContentViewController:containerController];

            [popoverController presentPopoverFromRect:selectedRect inView:self.view permittedArrowDirections:4 animated:YES];


            [imagePickerController.view setFrame:containerController.view.frame];
        
    
    else 
        [app.mainViewController presentModalViewController:containerController animated:YES];
       

希望对你有帮助

编辑:出于某种奇怪的原因,框架在横向时确实发生了变化。

要解决这个问题,您需要在呈现弹出框后设置图像选择器的视图框架。

我已经编辑了上面的代码来显示这一点。

另外,在您的控制器中,添加以下内容:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

    [imagePickerController.view setFrame:imagePickerController.view.superview.frame];

【讨论】:

谢谢。无论如何我可以得到iPad的宽度和高度为containerController.contentSizeForViewInPopover = CGSizeMake(768, 1000); ? ipad 分辨率为 768x1024。如果您希望弹出框占据整个屏幕,请尝试 CGSizeMake(self.view.frame.size.width,self.view.frame.size.height) 这种工作,但会导致另一个(奇怪的)错误:***.com/questions/8422636/…【参考方案2】:

当我尝试 Mutix 的解决方案时,弹出框只显示带有空白视图的导航栏。

我的解决方法是将 imagePickerController 添加为 containerController 的子项,而不仅仅是添加选择器的视图。

主要是替换这一行的意思:

[containerController.view addSubview:imagePickerController.view];

这些行:

[containerController addChildViewController:imagePickerController];
[containerController.view addSubview:imagePickerController.view];
[imagePickerController didMoveToParentViewController:containerController];

另外,在使用这种方式时,我不需要对横向模式进行任何特殊处理。

【讨论】:

以上是关于更改通过 UIPopOver (iPad) 呈现的 UIImagePicker 的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIPopOver 中更改边框颜色

点击 UITextField iPad 后 UIPopover 中的 datePicker

单击并打开 ipad 的相机时出现 uipopover 问题

在 iPad 中居中 uipopover

在 iPad 中关闭原生 UIActionsheet 和 UIPopover

有啥方法可以从 UITableView 索引中呈现 UIPopover 吗?