运行 iOS7 模拟器时 UIViewController 视图大小不正确

Posted

技术标签:

【中文标题】运行 iOS7 模拟器时 UIViewController 视图大小不正确【英文标题】:UIViewController view not size correctly when running iOS7 simulator 【发布时间】:2013-10-09 17:14:52 【问题描述】:

我有一个自定义 UIViewController,它创建一个视图,其中包含顶部的操作栏(带有 4 个按钮的视图)、一个表视图,然后是表视图下方的另一个视图。布局全部在代码中完成,不使用自动布局。 一切都在 ios 7.0 和 7.0.2 的各种设备上完美运行,但在模拟器中,控制器的根视图锚定在屏幕的右上角 (0,0) 而不是导航栏下方。

我将在 viewDidAppear: 方法中强制执行中继,但这似乎是一个 hack...

感谢您的任何见解

编辑:添加图像。您可以看到 UIView 突出显示。正如 ManicMonkOnMac 所提到的,UIView 位于工具栏下方(但这仅发生在模拟器中,在设备上,视图排列良好) 在控制器的 loadView 方法中,我在创建视图时设置了框架:

- (void)loadView

    // Our parent view controller will resize us appropriately. The size set
    // here is a convenience for initial view layout.
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

但是这个框架后来被改变了。不过,不是我的代码,而是 UIkit 代码)

Edit2:添加了 loadView 方法体

【问题讨论】:

截图会更好理解这个问题 【参考方案1】:

编辑:在经历了 WWDC 2013 的第 201 次会议之后,我想我有了解决方案。

在 iOS 7 中,您可以在视图控制器上设置一个属性,以指定您是否希望视图与导航栏重叠。

viewController.edgesForExtendedLayout = UIRectEdgeNone;//UIRectEdgeAll specifies that nav bars should overlap the view.

与 iOS 6 不同,导航栏放置在 iOS 7 中的视图之上。

使用不包括导航栏的框架大小。

代码:

CGRect frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y+self.navigationController.navigationBar.frame.size.height,self.view.frame.size.width, self.view.frame.size.height);

CustomView *view = [[CustomView alloc] initWithFrame:frame];

[self.view addSubview:view];

【讨论】:

但是为什么它可以在设备上运行,而不是模拟器呢?另外,我如何获得不包括导航栏的框架大小?现在我没有在代码中设置视图的大小,它是由窗口自动设置的 响应您的编辑,只需使用上面提到的方法加载视图而不是视图控制器。 抱歉,我不确定您指的是上面的哪种方法,或者鉴于我从头开始实例化视图,我不确定加载视图而不是控制器是什么意思。感谢您的帮助 我已经改变了上面的代码来加载视图,当你实例化你的视图时,只需使用上面派生的自定义框架。 有道理。我在建议的解决方案中看到了两个问题。 1:如果我这样做,我将不得不添加条件代码来检测模拟器上的 iOS 7,因为这是唯一失败的地方。 2:我已经这样做了,UIKit 稍后会在执行过程中更改大小。

以上是关于运行 iOS7 模拟器时 UIViewController 视图大小不正确的主要内容,如果未能解决你的问题,请参考以下文章

为啥 iOS7 模拟器无法启动或按预期启动...?

新的 Xcode 6 项目 - 如何在 iOS 7 模拟器中运行

在ios7中绘图时出现延迟

iOS7 UINavigationBar tintColor 在设置时更改为最大 .8

Swift 核心数据问题

Xcode 版本 5.1.1 (5B1008) - 在 iOS 7.0 而不是 7.1 上运行模拟器