自动调整UICollectionView标头大小

时间:2016-08-29 08:30:33

标签: ios swift uicollectionview uicollectionreusableview

我试图为待办事项列表类型的应用制作详细信息屏幕。这是详细屏幕目前的样子:

detail screen

这是UICollectionViewController,带有标题。标头包含2个UILabel个对象和一个UITextView对象。这些对象的布局由垂直UIStackView管理。 UIView用于设置白色背景。

我在运行时定义此UICollectionReusableView的高度时遇到了一些困难。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

以下是如何在没有XIB文件的情况下使用自动布局处理自定义UICollectionViewReusableView的方法。

  1. 实施referenceSizeForHeaderInSection委托方法。
  2. 在其中,实例化您用作标题视图的视图。
  3. 将其可见性设置为隐藏,以避免闪烁。
  4. 将视图添加到collectionview的超级视图。
  5. 使用自动布局设置其布局,以匹配标题的预期视觉效果。
  6. 调用setNeedsLayoutlayoutIfNeeded
  7. 从超级视图中删除视图
  8. 注意:我不是这个解决方案的忠实粉丝,因为它每次都会将自定义视图添加到collectionview的超级视图中,以执行计算。我没有注意到任何性能问题。

    注意#2:我将其视为临时解决方案,并在发布后转移到自我调整补充视图。

    我正在使用PureLayout进行自动布局。

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    
        let header = CustomHeaderView()
    
            header.isHidden = true;
            self.view.addSubview(header)
            header.autoPinEdge(toSuperviewEdge: .leading)
            header.autoPinEdge(toSuperviewEdge: .trailing)
            header.autoPin(toTopLayoutGuideOf: self, withInset: 0)
            header.setupHeader(withData: self.data)
            header.setNeedsLayout()
            header.layoutIfNeeded()
            header.removeFromSuperview()
    
            return header.frame.size
    }