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

时间:2011-12-07 15:39:17

标签: objective-c ipad uiimagepickercontroller uipopovercontroller

我正在尝试通过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];
    }   
}

2 个答案:

答案 0 :(得分:10)

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

您可以将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];
}

答案 1 :(得分:0)

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

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

主要意味着更换这一行:

[containerController.view addSubview:imagePickerController.view];

这些行:

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

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