UIImageView 创建额外的宽度/高度约束

Posted

技术标签:

【中文标题】UIImageView 创建额外的宽度/高度约束【英文标题】:UIImageView creates extra width/height constraints 【发布时间】:2015-09-29 16:49:32 【问题描述】:

当我在 Xcode 中调试视图时,我的 UIImageView 具有以下自动布局约束:

我期待在视图的设置器上初始化为 6 的宽度和高度。在调试时,这些约束应该是 40 而不是 6。但由于某种原因,(内容大小)的宽度和高度有额外的约束,实际上设置为 40。

这是我的imageViewdidSet 方法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() 进行调试,但没有成功)。

有趣的是,如果我通过从 UIImageView 中删除图像并设置背景颜色进行测试,那么约束会按预期工作,这样我就可以看到发生了什么。

有人知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

仔细检查我的函数constraintForLayoutAttribute:,filteredArray 属性实际上包含几个约束;我期望的宽度限制和其他两个内容大小限制。

我不确定是否有“修复”来改进我的方法,但我刚刚决定为宽度和高度约束创建出口并使用它们。

【讨论】:

以上是关于UIImageView 创建额外的宽度/高度约束的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 UIImageView 的大小?

向其内容添加宽度和高度约束后,UIScrollView 滚动停止工作

在 UIImageView 上设置顶部约束会导致 UILabel 固定高度

指定视图大小何时取决于多个子视图的约束

代码中的 UIImageView 和自动布局

尽管匹配宽度/高度约束,但启动屏幕故事板中的图像不可见