当我在Xcode中调试我的视图时,我的UIImageView
具有以下自动布局约束:
我期待在视图的setter上初始化为6的宽度和高度。在调试时,这些约束应该是40而不是6.但由于某种原因,(内容大小)的宽度和高度有额外的约束,实际设置为40。
这是imageView
的{{1}} didSet
方法:
IBOutlet
如果存在宽度和高度约束,则设置其最小宽度。作为一个注释,在我看来,我明确设置了这些宽度和高度约束,因此我的代码永远不会在宽度和高度都输入@IBOutlet private weak var imageView: UIImageView! {
didSet {
if let widthConstraint = imageView.constraintForLayoutAttribute(.Width)
{
widthConstraint.constant = MinimumImageLength
imageView.layoutIfNeeded()
}
else
{
let widthConstraint = NSLayoutConstraint(item: imageView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: MinimumImageLength)
NSLayoutConstraint.activateConstraints([widthConstraint])
}
if let heightConstraint = imageView.constraintForLayoutAttribute(.Height)
{
heightConstraint.constant = MinimumImageLength
imageView.layoutIfNeeded()
}
else
{
let heightConstraint = NSLayoutConstraint(item: imageView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: MinimumImageLength)
NSLayoutConstraint.activateConstraints([heightConstraint])
}
}
}
。
要获得正确的约束,我使用以下函数:
else
稍后我使用相同的函数来获取宽度/高度并更改两个常量。我在更新宽度/高度约束后调用extension UIView
{
func constraintForLayoutAttribute(layoutAttribute: NSLayoutAttribute) -> NSLayoutConstraint?
{
let filteredArray = constraints.filter { $0.firstAttribute == layoutAttribute }
return filteredArray.first
}
}
。 (我也试过调试layoutIfNeeded()
但没有运气)。
有趣的是,如果我通过从setNeedsUpdateConstraints()
中删除图像进行测试并仅设置背景颜色以便我可以看到正在发生的事情,那么约束会按预期工作。
有谁知道为什么会这样?
答案 0 :(得分:0)
仔细检查我的函数constraintForLayoutAttribute:
,filteredArray属性实际上包含几个约束;我期望的宽度约束和另外两个内容大小限制。
我不确定是否有“修复”来改进我的方法,但我刚刚决定为宽度和高度限制创建出口并改为使用它们。