假设我有一个UIView,
class CleverView: UIView
在自定义类中,我想这样做:
func changeWidth() {
let c = ... find my own layout constraint, for "width"
c.constant = 70 * Gameinfo.ImportanceOfEnemyFactor
}
类似地,我希望能够“找到”这样的约束(或者我猜,所有约束,可能不止一个),附加到四个边中的一个。
因此,要查看附加到我的所有约束,并找到任何宽度/高度约束,或者实际上任何与给定(比如“左”)边缘相关的约束。
有什么想法吗?
也许值得注意的是this question
请注意,(很明显)我问的是如何以动态/编程方式完成这一点。
(Yes,您可以说“链接到约束”或“使用ID”-QA的全部要点是如何动态地找到它们并动态地工作。)
如果您是约束的新手,请注意.constraints
只给您存储在“那里”的端点。
4条答案
按热度按时间webghufk1#
实际上有两种情况:
1.有关视图大小或与后代视图关系的约束保存在其自身中
1.两个视图之间的约束保存在视图的最低公共祖先中
**重复一遍。对于两个视图之间的约束,iOS实际上总是将它们存储在最低的公共祖先中。**因此,通过搜索视图的所有祖先,总是可以找到视图的约束。
因此,我们需要检查视图本身及其所有超级视图的约束。
在获得视图的所有约束后,可以应用各种过滤器,我想这是最困难的部分。
// edit:增强了示例并在注解中澄清了它们的解释
wj8zmpe12#
我想你可以使用
UIView
的constraints属性。constraints
基本上返回一个直接分配给UIView的约束数组。它不能让你得到由超级视图拥有的约束,如前导、尾随、顶部或底部,但宽度和高度约束由View本身拥有。对于超级视图的约束,你可以遍历超级视图的约束。假设智能视图有这些约束:输出:
顶部
前导
尾随的
超级视图约束:3
高度
自约束:1
基本上,您可以查看NSLayoutConstraint类来获取有关特定约束的信息。
要打印约束的名称,我们可以使用以下扩展名
1aaf6o9v3#
stakri
's answer是可以的,但我们可以使用sequence(first:next:)
做得更好:然后,如果我们检查Google的swift-benchmark的两个实现,我们可以看到
Sequence
的实现要快得多(在±相同的时间内几乎有+50k次迭代)。doinxwow4#
可能会保存一些打字的人......。
根据stakri的有奖答案,以下是如何获得
类型为“另一视图的分数宽度”的所有约束
“固定点宽度”类型的所有约束
“您的x位置”类型的所有约束
所以...
下面是完整的代码。当然,你也可以用同样的方法来做“height”。
所以,像这样使用它们...
或
此外,在底部我粘贴在一个简单的演示代码,示例输出...
这是密码V2 ...
只是一个示例演示...