Ios 为什么不';t相对于UIViewController框架的自动布局约束';s观点
我对整个自动约束系统有点困惑。为什么约束设置为常量??如果设置约束的目的是使您的视图能够适应不同的屏幕大小,那么为什么不根据它们与Ios 为什么不';t相对于UIViewController框架的自动布局约束';s观点,ios,autolayout,Ios,Autolayout,我对整个自动约束系统有点困惑。为什么约束设置为常量??如果设置约束的目的是使您的视图能够适应不同的屏幕大小,那么为什么不根据它们与self.view框架的相关性来设置它们呢 也许一个更具体的例子可以说明我的观点: 假设我有两个视图-view1和view2和view1在IB中的view2上方。当我在IB中设置它们的垂直间距约束时,我会得到如下结果: (对于view2)顶部空间到:view1;等于:39 让我困惑的是,为什么不是这样: 顶部空间:视图1;等于:0.2*self.view.bounds
self.view
框架的相关性来设置它们呢
也许一个更具体的例子可以说明我的观点:
假设我有两个视图-view1
和view2
和view1
在IB中的view2
上方。当我在IB中设置它们的垂直间距约束时,我会得到如下结果:
(对于view2)顶部空间到:view1;等于:39
让我困惑的是,为什么不是这样:
顶部空间:视图1;等于:0.2*self.view.bounds.height
因为当添加更多约束时,常数并不是表示视图位置的最佳方式,因为它们将在不同大小的屏幕上渲染
为什么约束设置为常量
它们不一定只是常数。NSLayoutConstraint
既有一个乘数
又有一个常数
。乘数根据另一个视图的某些属性缩放约束,并添加常量。发件人:
关于布局约束,这个等式可能是您需要记住的最重要的事情。您可以看到,通过将常量设置为0,可以使约束完全相对于第二个项的属性,或者通过将乘数设置为0,可以使约束绝对并完全忽略项2
,或者可以将它们一起使用
如果约束的目的是使您的视图能够适应不同的屏幕大小,那么为什么不根据它们与self.view框架的相对性来设置它们呢
关键不只是要适应不同的屏幕大小——您可以使用约束使接口适应各种情况。因此,您可以选择要相互约束的对象
让我困惑的是,为什么不是这样:顶部空间到:view1;等于:0.2*self.view.bounds.height
在有约束的情况下,使用这样的乘数当然是可能的。如果查看NSLayoutConstraints
reference页面,很容易看到如何在代码中设置它。要使用可视化编辑器执行此操作,请创建一个约束,然后在文档大纲中选择它。使用属性检查器根据您的喜好调整乘数
和常量
值(在您的示例中分别为0.2和0)
更新:具体来看您的示例,我不认为您可以设置一个取决于superview的高度的顶部
约束。我所能想到的最好的理由是,简单地调整UI以匹配屏幕大小是让UI适应不同屏幕的糟糕方法,这在很大程度上是我的猜测。例如,如果您使用屏幕大小来定位按钮,您将在大设备上看到大按钮,在小设备上看到小按钮,这没有多大意义:用户的手指不会改变大小,阅读文本的最佳大小也不会改变。我认为这里的目标是鼓励开发人员调整他们的UI,在更大的设备上显示更多的内容,而不是显示更大的内容
当然,存在一些间距问题,这些问题应该随着设备的大小而改变。例如,对于你的iPad应用程序来说,20像素的利润率可能正好合适,但你更愿意在小型设备上降到10像素的利润率。对于这种情况,使用大小类是有意义的,它允许您在不同类别的设备上使用不同的布局。布局仍应根据需要使用约束以适应特定设备,但大小类解决了一个事实,即大型设备的UI与小型设备上的UI有显著差异
另外,要知道,您可以在运行时轻松地调整与约束关联的值,即使您以可视化方式创建约束也是如此。可以将约束连接到视图控制器中的插座,就像将视图连接到插座一样。在运行时,您可以使用插座访问连接的约束,并根据需要调整常量
或乘数
值。如果使用故事板,两个视图之间的距离通常是恒定的。如果
如果需要相对于UIViewController视图框架的约束,可以在代码中设置约束。如下所示:
override func viewDidLoad() {
super.viewDidLoad()
var view1 = UIView()
var view2 = UIView()
let sapce = self.view.frame.size.height * 0.1
let verticalSpacingConstraint = NSLayoutConstraint(item: view2,
attribute: NSLayoutAttribute.Top,
relatedBy: NSLayoutRelation.Equal,
toItem: view1,
attribute: NSLayoutAttribute.Bottom,
multiplier: 1,
constant: sapce)
}
可以创建这样的约束,使用“等宽度/高度”约束,将子视图的“高度/宽度”设置为“超视图”,然后将约束的乘数设置为0.2或其他值,可能需要修改该值。或者你可以对类似的效果使用纵横比约束啊,别介意误解了你想要的,是的,我不认为你可以使顶部空间约束像那样灵活,你认为你能做的最好的是使约束的关系像>=那样,这样它就可以拉伸约束,但这不会使它成为一个固定的百分比,即运行时确定的Superview的高度是multiplier
?因为我认为默认值是1。您可以在故事板中约束的大小检查器下设置它。但我认为乘数有点误导,你不能将顶部空间限制设置为任意高度的0.2倍,所以它可能无法解决你的问题
override func viewDidLoad() {
super.viewDidLoad()
var view1 = UIView()
var view2 = UIView()
let sapce = self.view.frame.size.height * 0.1
let verticalSpacingConstraint = NSLayoutConstraint(item: view2,
attribute: NSLayoutAttribute.Top,
relatedBy: NSLayoutRelation.Equal,
toItem: view1,
attribute: NSLayoutAttribute.Bottom,
multiplier: 1,
constant: sapce)
}