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、自动布局和旋转

点击按钮时如何使collectionView标头隐藏?

按照用户方向旋转collectionView

旋转时多次调用方法 collectionview(cellForItemAtIndexPath)

当设备旋转而不将设备锁定为纵向模式时,如何将 collectionView 的所有项目保持在适当的位置?