集合视图中的自动布局 ImageView 高度锚冲突且无法正常工作

Posted

技术标签:

【中文标题】集合视图中的自动布局 ImageView 高度锚冲突且无法正常工作【英文标题】:Auto Layout ImageView Height Anchor conflicting in Collection View and not working properly 【发布时间】:2019-06-28 16:43:50 【问题描述】:

我遇到了这个问题,我在集合视图单元格中有这个图像视图,在 cellForRow 配置函数中,我正在设置图像视图的高度锚点,具体取决于模型对象是否包含图像。如果它包含图像,则高度为 200,否则为 1。现在我收到此错误。

该错误最初似乎修复了约束,当第一次加载集合视图时,我能够正确查看单元格。只有在我重新加载collectionview 时,我才遇到单元格不显示imageview 的问题,或者更确切地说,imageview 的高度是1,它应该是200。所以'1' 高度锚的优先级高于200 一个。

  Unable to simultaneously satisfy constraints.
        Probably at least one of the constraints in the following list is one you don't want. 
        Try this: 
            (1) look at each constraint and try to figure out which you don't expect; 
            (2) find the code that added the unwanted constraint or constraints and fix it. 
    (
        "<NSLayoutConstraint:0x600001643d40 UIView:0x7fd7fdea2ac0.height == 200   (active)>",
        "<NSLayoutConstraint:0x60000165eb70 UIView:0x7fd7fdea2ac0.height == 1   (active)>"
    )

我已经更改了优先级,但这似乎也不起作用:

   if post.postMedia.isEmpty 
            cell.postMedia.heightAnchor.constraint(equalToConstant: 1).isActive = true
            cell.postMedia.heightAnchor.constraint(equalToConstant: 1).priority = UILayoutPriority(rawValue: 999)
        else 
            cell.postMedia.heightAnchor.constraint(equalToConstant: 200).isActive = true
            cell.postMedia.heightAnchor.constraint(equalToConstant: 200).priority = UILayoutPriority(rawValue: 1000)
        

postMedia is the array that contains images. If it is empty the height anchor is 1 and priority is set to 999. and 200 one is given 1000. But that still doesn't work. Is there anything else I can do when two constraints are conflicting one another? 

我们将不胜感激。

【问题讨论】:

我认为每次加载单元格时都会添加新的约束。单元格被重复使用,因此您会获得图像高度的多个碰撞约束。您应该在单元格中保留对高度约束的引用,并在加载单元格时更新其常量。您可以将属性设为可选var heightConstraint: NSLayoutContraint?,如果在加载单元格时为nil,则创建一个,否则只需更新heightConstraint.constant = 200(或1)。 【参考方案1】:

我认为每次加载单元格时都会添加新的约束。单元格被重复使用,因此您会获得图像高度的多个碰撞约束。您应该在单元格中保留对高度约束的引用,并在加载单元格时更新其常量。

您可以将属性设为可选:

var heightConstraint: NSLayoutContraint?

如果加载单元格时为nil,则创建一个,否则只需更新heightConstraint.constant = 200(或1)。

let height: CGFloat = post.postMedia.isEmpty ? 1 : 200
if cell.heightConstraint == nil 
    cell.heightConstraint = cell.postMedia.heightAnchor.constraint(equalToConstant: height)
    cell.heightConstraint?.isActive = true
 else 
    cell.heightConstraint.constant = height

【讨论】:

以上是关于集合视图中的自动布局 ImageView 高度锚冲突且无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局自定义集合视图单元格的动态高度

表格视图单元格中的 ImageView 切断标签(自动布局)[关闭]

如何在imageView上设置自动布局约束以获得良好的分辨率图像?

swift 具有自动布局高度的ImageView

以编程方式更改约束布局中的高度?

自动布局为每个 collectionViewCell 计算相同的高度