呈现具有自定义大小的UIViewController

时间:2013-01-18 21:53:08

标签: ios uiviewcontroller popupwindow window-resize

我一直在墙上撞了一下头。我有一个使用Master-Detail SplitViewController作为其演示框架的iPad应用程序。我需要在应用程序首次加载时显示登录对话框,并使其具有自定义大小。我在主故事板中创建了一个UIViewController场景,并在DetailController首次加载时加载VC。

我遇到的问题是我无法控制VC的大小。我将它定义为FormSheet,以纵向模式显示。我将Presentation设置为FormSheet。我尝试以几种不同的方式明确设置大小,但绝对没有任何作用。

根本问题在于,由于所有这一切,VC 总是以全屏形式呈现为肖像。当我旋转到横向时,它以纵向模式保持,在左右两侧留下间隙并切断视图的顶部和底部。

这令人难以置信的沮丧,我真的不知道从哪里开始。有趣的是,在app完全加载后,我使用tap来呈现完全相同类型的VC。它使用以下设置精美呈现:

MyViewController *itemDetails;

itemDetails = [Globals.storyboard   instantiateViewControllerWithIdentifier:@"MyViewController"];

itemDetails.itemImage.image = imageView.image;
itemDetails.jewelryObject = jewelryObject;

itemDetails.delegate = self;

itemDetails.modalPresentationStyle = UIModalPresentationPageSheet;
itemDetails.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:itemDetails];

itemDetails.navigationItem.title = jewelryObject.itemDescription;

[navigationController setModalPresentationStyle:UIModalPresentationFormSheet];

[self presentViewController:navigationController animated:YES completion:nil];

navigationController.view.superview.autoresizingMask =
    UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleBottomMargin;

navigationController.view.superview.frame = CGRectMake(
    itemDetails.view.superview.frame.origin.x,
    itemDetails.view.superview.frame.origin.y,
    540.0f,
    450.0f
    );
navigationController.view.superview.center = self.view.center;

self.itemDetails = itemDetails;

我非常沮丧,甚至无法表达。尽管我喜欢iOS编程,但偶尔有一些WTF时刻让我希望自己是一个隐士。如果有人有任何“啊哈!”他们可以向我倾诉的见解,我真的很感激。

2 个答案:

答案 0 :(得分:5)

好的,所以...这在技术上不受支持。没有官方的方式来呈现某种规模的东西。所以这个问题的真正答案是 - 提交radar with Apple

但是......这是有可能的。但是,如果您不理解下面的代码,请不要使用它。它是这样的:

#import <objc/runtime.h>

UIViewController *viewControllerToPresent = /* ... */;
viewControllerToPresent.modalPresentationStyle = UIModalPresentationFormSheet;

Ivar instanceVar = class_getInstanceVariable([UIViewController class], "_formSheetSize");
if (instanceVar) {
    ptrdiff_t offset = ivar_getOffset(instanceVar);
    CGSize *offsetVCPtr = (CGSize*)(((uintptr_t)(__bridge void*)viewControllerToPresent) + offset);
    *offsetVCPtr = size;
}

// Present as usual with presentViewController:animated:completion:

这很难看,但它确实有效。请注意,我不特别建议在App Store应用程序中执行此操作,因为您可能无法在此处查看此类内容。使用风险自负!请记住您问题的真实答案 - 使用现有API无法完成。

答案 1 :(得分:1)

好吧,我终于弄明白了如何正确使用UISplitViewController,所以所有这些都与定制的VC一起跳舞是徒劳的。在详细控制器中设置完所有基本结构后,我调用[UISplitViewController presentViewController:animated:completion]。

我真的搞砸了一会儿。但它现在正在运作,所以......赢了! ; - )

感谢您的所有帮助。我真的很感激。你让我的车轮转动,这就是我需要的。我会在其他方面玩你的建议,只是为了满足自己的好奇心并为我的箭袋增加另一个箭头。

再次感谢!