【发布时间】:2013-11-15 22:59:47
【问题描述】:
我试图从一个视图控制器中以模态方式呈现一个视图,该视图控制器包含在另一个视图控制器中(例如,一个标签栏控制器,包含一个视图控制器,它以模态方式呈现另一个视图控制器)。
层级如下:
View Controller 1
view 1 (belonging to view controller 1)
view 2 (belonging to view controller 2)
-> presented view 3 (belonging to view controller 3)
我遇到的问题是,在 ipad 上,呈现的视图控制器出现在状态栏下方,而呈现的视图控制器在状态栏后面可见。我希望视图填满整个屏幕并位于状态栏后面。
奇怪的是,如果我从视图控制器 1 呈现模式,它工作正常,如果我尝试从视图控制器 2 呈现它,我就会遇到这个问题。
另一个奇怪的是,如果我在 iphone 模拟器中运行相同的代码,没有问题,按预期工作,但如果我在 ipad sim 中运行它,就会出现这个问题。
例如:
红色视图是视图控制器 2 的视图,绿色视图是视图控制器 3。
如您所见,在 iphone 上,视图控制器 3 覆盖了整个屏幕,而在 ipad 上,它位于状态栏下方。
为了测试这一点,在 xcode 中新建一个单视图通用项目,并将以下代码添加到创建的视图控制器中的 viewDidAppear 方法中并在 iphone 和 ipad 模拟器中运行:
-(void)viewDidAppear:(BOOL)animated
{
UIViewController *vc1 = [UIViewController new];
vc1.view.backgroundColor = [UIColor redColor];
[self.view addSubview:vc1.view];
UIViewController *vc2 = [UIViewController new];
vc2.view.backgroundColor = [UIColor greenColor];
[vc1 presentViewController:vc2 animated:YES completion:nil];
}
有人有什么想法吗?我已经根据苹果过渡指南尝试了新的 edgesForExtendedLayout 属性等的所有组合。我必须避免向 vc2 添加任何内容。
创建了 2 个示例项目 here,它们显示了呈现模式的选项卡栏应用程序和呈现模式的非选项卡栏项目之间的区别。两者的设置方式相同,只有 3 个视图控制器。
iphone 和 ipad 之间的差异似乎很奇怪。
奥利
【问题讨论】:
-
您添加的每个视图的框架是什么?
-
vc1 的框架设置为与其父视图的边界相同的大小。 vc2 的框架是由 presentViewController 方法设置的,你永远不会为模态框设置框架。
-
我遇到了完全相同的问题。我注意到,如果您进行旋转,它会绘制模态视图“全屏”,而不会显示当前视图的状态栏
标签: iphone ios objective-c ipad