1

请注意,这不是关于自行调整 UICollectionViewCell 大小的问题。

是否可以创建自己调整大小的 UICollectionView(使用 UICollectionViewFlowLayout)大小取决于其中的单元格?

我有一个包含可变数量单元格的集合视图。我想限制集合视图的宽度,然后允许它根据单元格的数量垂直扩展。

这个问题类似于iOS 中使用 Swift 3 的 CollectionView 动态高度,但我每行有多个单元格。

加分点,如果仍然可以在集合视图中使用自定大小的单元格,但是如果集合视图委托提供单元格大小就可以了。

4

2 回答 2

1

我没有足够的声誉发表评论,但我认为 这是 您正在寻找的答案。下面的代码:

 class DynamicCollectionView: UICollectionView {
     override func layoutSubviews() {
         super.layoutSubviews()
         if bounds.size != intrinsicContentSize() {
             invalidateIntrinsicContentSize()
         }
     }

     override func intrinsicContentSize() -> CGSize {
         return self.contentSize
     }
 }
于 2018-05-29T15:18:43.430 回答
0

@Michal Gorzalczany 的回答让我得到了这个答案(针对我的具体情况):

  1. 子类 UICollectionView

    class DynamicCollectionView : UICollectionView {
    
        weak var layoutResp : LayoutResponder?
    
        override func invalidateIntrinsicContentSize() {
            super.invalidateIntrinsicContentSize()
            self.layoutResp?.updateLayout()
        }
    
        override var intrinsicContentSize : CGSize {
            return self.contentSize
        }
    
        override var contentSize: CGSize {
            get { return super.contentSize }
    
            set {
                super.contentSize = newValue
                self.invalidateIntrinsicContentSize()
            }
        }
    }
    
  2. 协议LayoutResponder应该被高级处理集合视图布局的视图采用(我有一个相对复杂的布局)。

    protocol LayoutResponder : class {
        func updateLayout()
    }
    
    
    extension RespView : LayoutResponder {
        func updateLayout() {
            self.layoutResp?.setNeedsLayout()
            self.layoutResp?.layoutIfNeeded()
        }
    }
    

    就我而言,我实际上updateLayout()更进一步向前推进。

我想对于更简单的布局,您可以一起跳过第 2 步。

在我看来,这有点“hacky”,所以如果有人有更好的方法,如果你分享,我将不胜感激。

于 2018-05-30T12:33:42.343 回答