试图找到一个解决方案来更新一个事件上多个UI元素的多个约束。我见过一些停用,进行更改,然后重新激活约束的例子,这个方法对于我正在使用的24个锚点似乎不切实际。
我的一系列改变之一:
ticketContainer.translatesAutoresizingMaskIntoConstraints = false
ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true
ticketContainer.leftAnchor.constraintEqualToAnchor(self.rightAnchor, constant: 20).active = true
ticketContainer.widthAnchor.constraintEqualToConstant(200.0).active = true
ticketContainer.leftAnchor.constraintEqualToAnchor(self.leftAnchor, constant: 20).active = true
ticketContainer.widthAnchor.constraintEqualToConstant(100.0).active = true
5条答案
按热度按时间rsaldnfx1#
您是否尝试过将使用布局锚定创建的相关约束保存到属性中,然后只更改常量?
可能更优雅
根据您编写扩展的喜好,这里有一种可能更优雅的方法,它不使用属性,而是在
NSLayoutAnchor
和UIView
上创建扩展方法,以帮助更简洁地使用。首先,你需要在
NSLayoutAnchor
上写一个扩展,如下所示:此扩展允许您在从锚创建约束的同一方法调用中设置约束的标识符。注意,Apple文档暗示XAxis锚点(左、右、行距等)不允许您使用Y轴锚点创建约束(顶部、底部等),但我没有观察到这是真的。如果你确实想要这种类型的编译器检查,您需要为
NSLayoutXAxisAnchor
、NSLayoutYAxisAnchor
和NSLayoutDimension
(用于宽度和高度约束)编写单独的扩展,以强制执行相同轴锚类型的要求。接下来,您将在
UIView
上编写一个扩展,以通过标识符获得约束:有了这些扩展,您的代码就变成了:
请注意,使用常量或枚举而不是魔术字符串名称作为标识符将是对上述方法的改进,但我的回答要简明扼要。
57hvy0tb2#
你可以遍历视图的约束并检查匹配的项和锚点。记住,除非是维度约束,否则约束将位于视图的超级视图上。我写了一些帮助代码,可以让你找到视图的一个锚点上的所有约束。
gr8qqesn3#
定位单视图
用法
cnh2zyt34#
我找到了另一个解决方案。如果你想改变一个通过界面生成器添加的现有约束,你实际上需要迭代超级视图的约束。这至少在你试图改变对齐约束的常量值时是正确的。
下面的例子显示了底部对齐,但我假设相同的代码将工作的前导/尾随/顶部对齐。
0x6upsns5#
有用的扩展
如何使用