我怎样才能使用自动布局(ios6 + ios7)4“和3.5”iphone屏幕的故事板?

关于构build可在4英寸和3.5英寸屏幕尺寸上工作的故事板布局,有许多问题和答案,但对于以下情形我找不到合适的解决scheme。

我使用ios6(和ios7)自动布局,我不必支持landscpae或ipad。 我有一个UIView有几个子视图,必须看起来像下面的模型。 在故事板中设置自动布局约束是很容易的,以适应任何一种屏幕尺寸。 我的问题是 – 如何使自动布局根据运行时的屏幕大小select正确的约束?

屏幕MOCKUPS

请注意,我不想使用2个不同的故事板。 在我的整个应用程序中这样做会是很多工作,我将不得不挂钩每个故事板上的所有代表,sockets和操作。 屏幕上的变化需要我做两倍的工作。

我已经尝试了2种方法使这个工作在一个故事板上,但是我对其中的任何一个都不满意。

  • 加倍限制。 较大的约束(50)具有比较低的约束(30)更高的优先级。 这种方法的问题是,在3.5“的屏幕尺寸上,自动布局可能会select一个较低的优先级约束 – 足以满足布局 – 但留下一些高优先级的约束。

双重约束

  • 子类NSLayoutConstraint。 在这个方法中,故事板中的所有约束都被设置为NSDualLayoutConstraint。 在NSDualLayoutConstraint的初始化代码中,在运行时屏幕大小为3.5“的情况下,约束的常量更改为3_5_constant的值,但这种方法更具确定性,但在界面生成器预览中看不到3.5”布局。

在这里输入图像说明


如果只有界面生成器约束有一个次要的常量值,当屏幕大小为3.5“时,这将解决我的问题。所以我仍然与我的问题 – 我怎么才能正确地使用一个故事板布局子视图正确4“和3.5”屏幕尺寸?

如果您只想使用一个故事板,并且不想使用自动布局,这将使您的生活更轻松地展示在图表中,您将不得不使用代码布局视图。

您只需要检测用户是否在4“设备上运行,并相应地布置您的视图。

 #define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON) if (IS_568_SCREEN) { // Lots of code to layout for 4" devices } else { // Lots of code to layout for 3.5" devices } 

但是,如果你使用自动布局,你会发现它会为你节省大量的时间和代码。 不需要使用上面提到的解决scheme手动布置代码中的每个视图,只需要根据设备更新y和高度约束。

考虑到这个图表显示了什么样的自动布局会为你处理,你需要手动更新,这应该有助于绘制一个更好的图片,你将利用自动布局保存多less。

在这里输入图像说明

 #define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON) if (IS_568_SCREEN) { self.layoutConstraintY.constant = 50.0f; self.layoutConstraintHeight.constant = 248.0f; } else { self.layoutConstraintY.constant = 30.0f; self.layoutConstraintHeight.constant = 220.0f; } [self layoutIfNeeded]; 

这个计算器的答案已经为我解决了同样的问题。

关键是使一个IBOutlet的约束(如高度)。 然后做这样的事情

 - (void)updateViewConstraints { [super updateViewConstraints]; self.myConstraintFromIB.constant = [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100; } 

您将需要以编程方式编辑您的约束。 你可能会发现这个问题有帮助。

您也可以在一个故事板文件中有两个独立的Storyboard文件或两个viewController场景。

如何添加一个额外的视图,并包括其中的方形视图? 额外的视图应该是透明的,所以没有人看到它。 将额外视图的约束设置为使用屏幕大小进行展开,并将方形视图的约束设置为以附加框为中心。 select相对于附加框的方形视图大小的乘数