使用AutoLayout使UICollectionViewCell的高度匹配其内容(所有子视图的总和)

时间:2019-04-14 15:30:51

标签: ios uicollectionview autolayout uicollectionviewcell ios-autolayout

我找到了下一个答案,使UIView的高度与其内容https://stackoverflow.com/a/39527226/7767664

匹配

我对其进行了测试,它可以正常工作(如果情节提要中的UIView高度大小大于或小于其内容,则在运行时它将自动调整大小以匹配内容)。

但是,如果我使用UICollectionViewCell而不是UIView,则什么也没有改变,单元格的高度永远不会改变,它始终具有故事板属性中具有的硬编码高度:

enter image description here

我还能做什么?

我在UIControllerView中也有2个部分(2列)。 即使它们的大小内容不同,一行中的两个单元格也应具有相同的大小(在将RecyclerView与GridLayoutManager一起使用时,在Android中本机实现的这种操作非常简单)

更新

它可以与UIView一起使用,因为我将其最大限制条件设置为“安全Are'a顶部”

我无法使用UICollectionViewCell

更新2

似乎我对这个答案https://stackoverflow.com/a/25896386/7767664

有所进步

但我需要newFrame.size.width = CGFloat(ceilf(Float(size.width)))而不是newFrame.size.height = CGFloat(ceilf(Float(size.height)))

当我们使用此解决方案时,请不要在单元格底部添加任何约束,否则它将无法正常工作

使用此解决方案,我无法真正使用任何边距,否则其中的某些部分在单元格底部变得不可见

我想可以通过https://stackoverflow.com/a/31279726/7767664这个问题来解决

2 个答案:

答案 0 :(得分:0)

您可以尝试在collectionView扩展内部或本机collectionViewController类内部调用此函数:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        //return something like the size. I write you an example how to use it.
        // You can easily change the value according to your stuff contents height.

        return CGSize(width: collectionView.frame.size.width/3, height: 100)
    }

答案 1 :(得分:0)

感谢https://stackoverflow.com/a/25896386/7767664https://stackoverflow.com/a/31279726/7767664

,我解决了我的问题

我决定将一个UIView放在其中的所有UICollecitonViewCell

我将UIView的行尾,前导,顶部设置为ICollecitonViewCell,但没有将底部设置为单元格视图(您应该在UIView中使用最新的子视图并连接其底部,而不是与单元格连接查看)

然后我将UIView的引用添加到自定义单元格类中,并将其高度用作单元格的高度:

public class MyCustomItemCell: UICollectionViewCell {

    // other child views references ...

    @IBOutlet weak var wrapperView: UIView! // view which contains your other views

    //forces the system to do one layout pass
    var isHeightCalculated: Bool = false

    override public func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        //Exhibit A - We need to cache our calculation to prevent a crash.
        if !isHeightCalculated {
            setNeedsLayout()
            layoutIfNeeded()
            var newFrame = layoutAttributes.frame
            newFrame.size.height = wrapperView.frame.height // use height of our UIView
            layoutAttributes.frame = newFrame
            isHeightCalculated = true
        }
        return layoutAttributes
    }
}