编辑框架高度集合可重用视图

Cul*_*tes 3 xcode ios uicollectionreusableview swift swift2

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

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

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

这是我的结构的图像:

结构视图

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

标题集合可重用视图的所有功能都在一个扩展UICollectionReusableView. 我能读self.frame.height,但我不能写。我似乎能够编辑框架(为什么高度是只读的,而框架不是,苹果?)。然而,这没有效果,甚至self.frame = CGRectZero没有做任何事情。

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

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

Pat*_*nch 5

您不能直接操作集合视图中视图的大小。要控制它们的大小,您的集合视图的委托应符合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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)