Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不';t相对于UIViewController框架的自动布局约束';s观点_Ios_Autolayout - Fatal编程技术网

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)

}