CollectionView 标头不会在自动旋转时调整大小
Posted
技术标签:
【中文标题】CollectionView 标头不会在自动旋转时调整大小【英文标题】:CollectionView header doesn't resize on auto rotate 【发布时间】:2015-06-09 06:48:16 【问题描述】:我的 CollectionView 中有一个 headerView,并根据标签的文本大小以编程方式调整了 headerView 的大小。在旋转到横向时,可重用的标题视图不会自动调整大小,但在滚动时它会调整自身大小以提供预期的结果。
下面是我用来调整标题大小的 sn-p。
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView
switch kind
case UICollectionElementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "HeaderView", forIndexPath: indexPath) as! CollectionViewHeader
var headerString = westBeaches[indexPath.section] as NSString
var newSize: CGSize = headerString.sizeWithAttributes([NSFontAttributeName:headerView.headerText.font])
headerView.frame.size.width = newSize.width + 20
headerView.layer.cornerRadius = 15
headerView.headerText.text = westBeaches[indexPath.section]
headerView.center.x = collectionView.center.x
headerView.alpha = 0.7
return headerView
default:
assert(false, "Unexpected element Kind")
CollectionViewHeader 是继承 UIcollectionReusableView 的自定义类,包含 headerText 作为 UILabel。当方向改变时,有什么方法可以防止可重用视图恢复到原来的大小?
【问题讨论】:
您是否尝试过在您的viewWillLayoutSubviews
方法中调用collectionView.collectionViewLayout.invalidateLayout()
?
【参考方案1】:
对我来说,我有一个 UISearchBar 作为标题,并且遇到了同样的问题。也就是说,旋转后搜索栏不会填满 CollectionView 的宽度。
我通过在旋转动画旁边设置搜索栏的宽度来修复它。
在UIViewController
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
// Animate searchBar too
coordinator.animateAlongsideTransition( [unowned self] _ in
var frame = self.searchController.searchBar.frame
frame.size.width = size.width
self.searchController.searchBar.frame = frame
, completion: nil)
【讨论】:
【参考方案2】:您必须为方向更新 UICollectionView 流布局。
override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation)
collectionView.performBatchUpdates( () -> Void in
, completion: (complete) -> Void in
)
【讨论】:
如何更新 UICollectionReusableView 的大小? func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize return CGSizeMake(itemWidth, itemWidth) 更改您的项目大小。然后更新collectionview。 我相信这只会调整单元格大小而不是标题大小...... 是的,对于标题,您必须在旋转时更改大小,然后更新 uicollectionview以上是关于CollectionView 标头不会在自动旋转时调整大小的主要内容,如果未能解决你的问题,请参考以下文章
旋转屏幕时,带有嵌入式 tableview 的 Collectionview 被剪裁
iOS 8 中的嵌套 CollectionView、自动布局和旋转