我的故事板中有以下视图控制器:
默认情况下,它总是有6个图像视图,宽度和高度相等。每个图像视图都被约束到超级视图:"相等的高度"乘数为1/2。
然而,在我加载图像之前,我读了一个属性,它给了我一个图像所需的高度(宽度永远不会被修改)。
所以我的界面(在运行时)看起来像这样:
我想我需要修改乘数常数,但它是只读。
我看到帖子说我们可以更新约束的常量属性,但它是分数,我需要它才能在每个设备上运行。
现在你会推荐什么?我应该删除约束并添加一个新约束吗?如果我不删除它并尝试应用新的高度限制,它是否会自动删除?
我是否必须使用像snapkit这样的pod来完成这项工作?
感谢您的帮助。
修改
这是我尝试的代码,但没有成功:
for (index, (drawing, ratio)) in drawingElements.enumerate() {
drawingViews[index].image = UIImage(named: drawing)
// update height constraint if ratio is different than defaut ratio of 1/2
if ratio != 0.5 {
heightConstraints[index].active = false
let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0)
drawingViews[index].addConstraint(newHeightConstraint)
self.view.layoutIfNeeded()
}
}
我做错了吗?我不确定新的高度限制,但
答案 0 :(得分:8)
所以这就是我实现这个目标的方式:
以编程方式创建约束(在我的情况下为高度):
// Drawing height property
var drawingHeightConstraint: NSLayoutConstraint?
停用旧约束并根据需要设置新约束
注意:heightContraints是NSLayoutConstraint的数组,其中包含我的出口
for (index, (drawing, ratio)) in drawingElements.enumerate() {
drawingViews[index].image = UIImage(named: drawing)
// update height constraint if ratio is different than defaut ratio of 1/2
if ratio != 0.5 {
heightConstraints[index].active = false
drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0)
drawingHeightConstraint!.active = true
}
}
答案 1 :(得分:5)
约束常量与受约束元素的内容相关。 这就是为什么你得到这样的屏幕。最简单的方法 - 创建具有清晰颜色的图像并默认设置它。下载完成后,只需为您的imageView设置新图像
或者您可以为您的身高限制设置IBOutlet - 并针对不同情况更改其值 即。
#
答案 2 :(得分:0)
由于我不知道的原因(可能是某种Apple的实现细节),您无法更改乘数。但是,您可以删除约束并创建新约束。您必须删除旧约束,因为它不会自动删除,并且您将遇到冲突。或者,您可以创建具有较低优先级的第一个约束(具有0.5
乘数)。这样你可以保留它(自动布局会忽略它),但我认为这不是一种方法,因为你为什么需要这种不必要的约束?只需删除它。
至于第三方布局引擎和库 - 遗憾的是,我不能在这里给你任何建议。