gpt4 book ai didi

ios - 为什么自动布局约束不是相对于 UIViewController View 的框架

转载 作者:行者123 更新时间:2023-11-29 10:25:18 26 4
gpt4 key购买 nike

我对整个自动约束系统有点困惑。为什么约束设置为常量?如果约束的目的是让您的 View 可以适应不同的屏幕尺寸,为什么不根据它们与 self.view 框架的相关性来设置它们。

也许一个更具体的例子可以说明我的观点:

假设我有两个 View - view1view2 并且 view1 在 IB 中位于 view2 之上。当我在 IB 中设置它们的垂直间距约束时,我会得到如下内容:

(for view2) Top Space to: view1 ; Equals: 39

让我困惑的是,为什么不是这样的:

Top Space to: view1 ; Equals: 0.2 * self.view.bounds.height

当添加更多约束时,当 View 要在不同尺寸的屏幕上呈现时,常量并不是表示 View 位置的最佳方式。

最佳答案

Why are constraints set to be constants??

它们不一定只是常量。 NSLayoutConstraint 有一个 multiplier 和一个 constant。乘数根据另一个 View 的某些属性缩放约束,并添加常量。来自 the docs :

item1.attribute1 = multiplier × item2.attribute2 + constant

这个等式可能是您需要记住的关于布局约束的最重要的事情。您可以看到,通过将 constant 设置为 0,您可以使约束完全相对于第二项的属性,或者您可以通过设置使约束成为绝对约束并完全忽略 item2 multiplier 为 0,或者您可以一起使用它们。

If the point of having constraints is so that your views could be adaptive to different screen size, why aren't they set in terms of their relativity to the frame of self.view.

重点不仅仅是适应不同的屏幕尺寸——您可以使用约束来制作适应各种事物的界面。因此,您可以选择要相互约束的对象。

What confuses me is, why isn't it something like this: Top Space to: view1 ; Equals: 0.2 * self.view.bounds.height

在有约束的情况下使用这样的乘数当然是可能的。如果您查看 NSLayoutConstraints 引用页,就会很容易看出如何在代码中设置它。要使用可视化编辑器执行此操作,请创建一个约束,然后在文档大纲中选择它。使用属性检查器根据您的喜好调整 multiplierconstant 值(在您的示例中分别为 0.2 和 0)。

更新:具体看你的例子,我不认为你可以设置一个依赖于 super View 的高度top约束.我能想到的最好的理由(这主要是我的猜测)是简单地缩放您的 UI 以匹配屏幕大小并不是使您的 UI 适应不同屏幕的糟糕方法。例如,如果你使用屏幕尺寸来定位按钮,你最终会在大设备上有很大的按钮而在小设备上有小按钮,这没有多大意义:用户的手指不会更改大小,阅读文本的最佳大小也不会更改。我认为这里的目标是鼓励开发人员调整他们的 UI 以在更大的设备上显示更多内容,而不是显示更大内容。

当然,有一些间距问题应该随着设备的大小而改变。例如,20 像素的边距可能恰好适合您的 iPad 应用程序,但您更愿意在小型设备上将边距降至 10 像素。对于这种情况,使用大小类是有意义的,它可以让您在不同类别的设备上使用不同的布局。您的布局仍应根据需要使用约束以适应特定设备,但大小类解决了大型设备的 UI 与小型设备上的 UI 明显不同的事实。

此外,您还可以在运行时轻松调整与约束关联的值,即使您以可视方式创建约束也是如此。您可以将约束连接到 View Controller 中的导出,就像将 View 连接到导出一样。在运行时,您可以使用导出访问连接的约束并根据需要调整 constantmultiplier 值。

关于ios - 为什么自动布局约束不是相对于 UIViewController View 的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com