使用Xcode 7.0 beta,Swift 2.0,IOS 9支持

我有一个视图控制器,其中包含一个集合视图。里面是一个标头:集合可重用视图,一个集合:集合视图单元格和一个页脚:集合可重用视图。

在标题内,我具有登录,注册或注销的功能。
根据单击的按钮,此标题内的视图是否被隐藏。现在,我要做的最后一件事是重新调整标题视图(集合可重用视图)的框架高度。因为登录时,RegisterView和LoginView都将被隐藏,这将留下大量的空白空间。

这是我的结构的图像:

我很快注意到我无法向Collection Reusable View添加任何约束:(

标头Collection Reusable View的所有功能都在扩展UICollectionReusableView的类内。我可以读取self.frame.height,但无法写入。我似乎能够编辑框架(为什么高度是只读的,为什么框架不是,苹果?)。但是,这没有任何效果,即使self.frame = CGRectZero也不起作用。

我注意到在初始化页眉和页脚(func collectionView, switch on kind -> UICollectionElementKindSectionHeader)时,可以在主ViewController.swift中执行此操作,但这不是我想要的,因为单击按钮时应更改它。

现在,我将RegisterView向上移动(我在代码中编辑了顶部约束)。

最佳答案

您不能直接在集合视图中操纵视图的大小。要控制它们的大小,您的集合视图的委托应符合UICollectionViewDelegateFlowLayout,然后可以通过在该协议上实现collectionView(_:layout:referenceSizeForHeaderInSection:)方法来返回该节中标头所需的任何大小。如果标题不可见,只需返回0.0的高度即可。以某种需要更新此布局的方式更改了视图控制器的状态后,请在集合视图的布局上调用invalidateLayout(),以在您的委托上触发这些布局方法。

class MyCollectionViewController : UICollectionViewController, UICollectionViewDelegateFlowLayout {

    var shouldHideHeader: Bool = false {
        didSet {
            self.collectionView?.collectionViewLayout.invalidateLayout()
        }
    }

    let defaultHeaderSize: CGFloat = 100.0
    let loginHeaderSectionIndex: Int = 0

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

        if self.shouldHideHeader && section == self.loginHeaderSectionIndex {
            return CGSize(width: collectionView.bounds.width, height: 0.0 )
        }
        else {
            return CGSize(width: collectionView.bounds.width, height: self.defaultHeaderSize)
        }
    }
}

10-08 10:48