我一直在墙上撞了一下头。我有一个使用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时刻让我希望自己是一个隐士。如果有人有任何“啊哈!”他们可以向我倾诉的见解,我真的很感激。
答案 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]。
我真的搞砸了一会儿。但它现在正在运作,所以......赢了! ; - )
感谢您的所有帮助。我真的很感激。你让我的车轮转动,这就是我需要的。我会在其他方面玩你的建议,只是为了满足自己的好奇心并为我的箭袋增加另一个箭头。
再次感谢!