iOS Autolayout – 如何在视图之间设置两个不同的距离取决于屏幕高度

我知道我错过了一些东西,因为这个东西很容易实现。

我的问题是,我已经在我的“加载屏幕”(出现在飞溅之后)UIImageView与3.5“和4”大小的屏幕上的两个不同的图像。 在这个图像的某个地方,我把一个UIActivityIndi​​cator,告诉用户应用程序正在加载的东西在后台。 这两个图像的地方是不一样的,因为其中一个明显高于另一个,所以我想设置一个自动布局约束,允许我把这个活动指标放在不同的高度,取决于应用程序运行在iPhone 5或没有。

如果没有Autolayout,我会将view的frame.origin.y设置为300(例如),然后在ViewController的viewDidLoad方法中,我会问是否应用程序在iPhone 5中运行, d将值改为例如350.我不知道如何使用Autolay来做到这一点,我认为它非常简单。

您可以在视图控制器上创build一个NSLayoutConstraintsockets,并将sockets连接到xib或故事板中的活动指示器的Y约束。 然后,添加一个updateViewContraints方法到你的视图控制器,并根据屏幕大小更新约束的常量。

连接约束到出口

这是一个updateViewConstraints的例子:

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

当然,你会想要把你的适当的价值,而不是200100 。 你可能想要定义一些命名常量。 另外,不要忘记调用[super updateViewConstraints]

@Rob答案的问题是你应该为每个约束做很多代码。 因此,要解决这个问题,只需将ConstraintLayout类添加到您的代码中,并修改您在IB中所需的设备的约束常量值即可:

在这里输入图像描述

 // // LayoutConstraint.swift // MyConstraintLayout // // Created by Hamza Ghazouani on 19/05/2016. // Copyright © 2016 Hamza Ghazouani. All rights reserved. // import UIKit @IBDesignable class LayoutConstraint: NSLayoutConstraint { @IBInspectable var 📱3¨5_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 480 { constant = 📱3¨5_insh } } } @IBInspectable var 📱4¨0_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 568 { constant = 📱4¨0_insh } } } @IBInspectable var 📱4¨7_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 667 { constant = 📱4¨7_insh } } } @IBInspectable var 📱5¨5_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 736 { constant = 📱5¨5_insh } } } } 

不要忘记从ConstraintLayoutinheritance你的类约束,我将尽快添加objective-c版本

Auto Layout中pipe理UI对象位置的基本工具是Constraints。 约束描述了两个视图之间的几何关系。 例如,您可能有一个约束:“进度条的右边连接到它们之间的空白空间的左边缘。”

这意味着使用AutoLayout你不能根据UIDevice的模式进行有条件的位置设置,而是你可以创build一个视图布局来修改自己,例如。 该应用程序基于约束在3.5英寸全屏(IPhone4)或4英寸全屏(IPhone5)上运行。

所以select你的问题使用约束:

1)在你的布局上find一个视图,可以用来创build一个约束来相对定位进度条。 (使用CMDbuttonselect视图和进度条,然后使用Editor / Pin / Vertical Spacing菜单项在两个对象之间创build一个垂直约束)

2)创build一个绝对约束,以将进度条的位置粘贴到屏幕边缘(保持空间)或集中

我发现这个关于AutoLayout的教程很有帮助,这也许对你有所帮助: http ://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

请注意:自动布局仅适用于IOS 6。

我通常总是试图留在Interface Builder中来设置约束条件。 例如,如果在iPhone 4和iPhone 6上有完全不同的布局,那么在代码中潜水以获得更多控制通常很有用。

正如前面提到的,在Interface Builder中不能有条件语句,那就是将约束链接到你的视图控制器时真的很方便。

以下是针对不同屏幕尺寸解决自动布局问题的3种方法的简要说明: http : //candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/