• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - UICollectionView 自定义流布局在滚动时崩溃

[复制链接]
菜鸟教程小白 发表于 2022-12-13 17:15:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在创建带有节标题的自定义 flowLayout。

这是我的 flowLayout.swift

import UIKit

class FlowLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
       // let attributesForElementsInRect = super.
        var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()

        // unwrap super's attributes
        guard let attributesForElementsInRect = super.layoutAttributesForElementsInRect(rect) else { return nil }

        // modify attributes

        var leftMargin: CGFloat = 0.0;



        for attributes in attributesForElementsInRect {

            let itemAttributesCopy = attributes.copy() as! UICollectionViewLayoutAttributes

            if( itemAttributesCopy.frame.size.width + leftMargin > self.collectionView?.frame.size.width)
            {
                leftMargin = 8.0
            }
            if (itemAttributesCopy.frame.origin.x == self.sectionInset.left) {
                leftMargin = self.sectionInset.left
            } else {
                var newLeftAlignedFrame = itemAttributesCopy.frame
                newLeftAlignedFrame.origin.x = leftMargin
                itemAttributesCopy.frame = newLeftAlignedFrame
            }
            leftMargin += itemAttributesCopy.frame.size.width + 8
            print(itemAttributesCopy.frame)

             newAttributesForElementsInRect.append(itemAttributesCopy)
            print(itemAttributesCopy)
        }

        return newAttributesForElementsInRect
    }

}

这是我的 ViewController,带有节标题的委托(delegate)功能

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {


        if(sectionsArray.count == 0)
        {
            return 1
        }
        else
        {
            return sectionsArray.count
        }
    }


     func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

            let headerView: TagHeader = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "TagHeader", forIndexPath: indexPath) as! TagHeader

            headerView.sectionLabel.text = sectionsArray[indexPath.section].header
            return headerView
        }

所以当我运行应用程序时,它会显示部分标题,一切正常。

但是当我滚动时,应用程序崩溃并出现以下来自调试器的错误

2016-07-01 18:52:12.051 TagFlowLayout[15025:4704387] *** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionViewData.m:408
2016-07-01 18:52:12.054 TagFlowLayout[15025:4704387] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'layout attributes for supplementary item at index path (<NSIndexPath: 0x17e96f70> {length = 2, path = 0 - 0}) changed from <UICollectionViewLayoutAttributes: 0x17e7ab00> index path: (<NSIndexPath: 0x17d8fb30> {length = 2, path = 0 - 0}); element kind: (UICollectionElementKindSectionHeader); frame = (8 0; 314 50); zIndex = 10;  to <UICollectionViewLayoutAttributes: 0x17e9d770> index path: (<NSIndexPath: 0x17e96f70> {length = 2, path = 0 - 0}); element kind: (UICollectionElementKindSectionHeader); frame = (0 0; 314 50); zIndex = 10;  without invalidating the layout'



Best Answer-推荐答案


更新前需要使现有布局失效,见报错文末:

without invalidating the layout

你应该重写 UICollectionViewFlowLayout 子类的方法:

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        return true
    }

更多引用见Apple Documentation for UICollectionViewLayout

关于ios - UICollectionView 自定义流布局在滚动时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38146913/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap