使用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)
}
}
}