使用Autolayout的Xcode中的Storyboard外形和活动scheme之间的关系是什么?

我有一个针对iOS7的Xcode 5.0.1项目。 我正在devise一个Storyboard的应用程序,我正在使用Autolayout。

当我构build并运行应用程序时,我正在使用iOS模拟器来testing它。 我切换3.5“和4”视网膜scheme之间查看不同的屏幕尺寸的应用程序。

大多数情况下,一切正常,Autolayout似乎很好。 但是,在一个屏幕上,布局有问题,但只有在以下情况下:

  • 我在iOS模拟器下将该scheme设置为“iPhone Retina(4英寸)”
  • 在故事板上,外形设置为“视网膜3.5英寸”

在这种情况下,Autolayout似乎无处不在,除了一个地方我使用更复杂的视图结构:

观点不正确

但是,如果我简单地将故事板上的外形因素更改为“Retina 4英寸”,故事板上的所有内容都看起来不错,而且它在运行时看起来也不错。 如果我在“视网膜3.5英寸”的形状因素,并将iOS模拟器更改为“iPhone视网膜(3.5英寸)”,也是如此:

视图看起来很好

所以,我的问题是:这是正确的行为? 故事板的外形尺寸是否必须与您正在testing的设备相匹配? 我想知道,因为这是故事板中唯一引起问题的视图,但是,切换形状因子使得所有的行为都正常,所以看起来Autolayout工作正常。

不,Storyboard的形状因子是为了向您展示不同屏幕尺寸的外观。 它没有规定运行时视图的大小。

我的猜测是,在你的视图中必须有一些限制,在屏幕上没有正确设置4“屏幕。

我知道这个问题很老,但我刚刚经历并解决了同样的问题。

我的情况是这样的:

1)我有一个UITableView,约束到我的视图控制器的框架的大小。 2)在viewDidLoad方法中,我添加了一个表头视图,使用我的表视图的框架作为头框架。

UIView *headerView = [UIView alloc]initWithFrame:self.tableView.frame]; self.tableView.tableHeaderView = headerView; 

这给了我一个标题,把表格视图上的内容隐藏起来,直到标题被刷新(类似于雅虎的天气)。

3)在标题的底部,我有一对标签显示在向上滑动之前可见的信息。

问题:

如果我在3.5“模拟器上启动了我的应用程序,但是将故事板设置为4”电话,我的标题视图底部的标签将呈现在屏幕底部以下,将其切断。

如果我在4“模拟器上启动我的应用程序,但故事板设置为3.5”,标签在表格的标题视图中显示得太高。

如果我在故事板设置的相同尺寸的模拟器上启动应用程序,那么一切都很完美。

经过几个小时的敲打之后,我意识到我的表格视图的框架在调用viewDidLoad时没有使用自动布局约束来设置。 这是从我的故事板在这一点上推断的大小,并在以后的约束基础上进行调整。 因此,我的表视图标题与我的表视图的大小不一样。

移动代码添加表视图标题,根据表视图的大小

 viewDidLayoutSubviews 

方法,当自动布局约束已经被应用解决了这个问题。

我有一个与UIScrollView相同的问题。 上面的user3847320答案可能是正确的。 但在我的情况下,我做了viewDidLayoutSubviews布局的东西崩溃。

要快速避免这种情况,只需在viewDidLoad中添加以下内容:

 - (void)viewDidLoad { [super viewDidLoad]; self.scrollView.frame = self.view.frame; }