UICollectionView自定义流布局在滚动时崩溃 [英] UICollectionView custom flow layout crashes on scrolling

查看:318
本文介绍了UICollectionView自定义流布局在滚动时崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am creating a custom flowLayout with section headers.

这是我的flowLayout.swift

here is my 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,具有节标题的委托功能

here is my ViewController with delegate function for section header

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
        }

因此,当我运行该应用程序时,它会向我显示节标题,并且一切正常.

So when I run the app, it shows me the section headers and everything works fine.

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

But when I scroll, app crashes with following error from debugger

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'

推荐答案

在更新之前,您需要使现有布局无效,请参见错误消息的结尾:

You need to invalidate the existing layout before updating, see the end of the error message:

在不使布局无效的情况下

without invalidating the layout

您应该重写UICollectionViewFlowLayout子类中的方法:

You should override the method at the subclass of UICollectionViewFlowLayout:

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

有关更多参考,请参见 UICollectionViewLayout的Apple文档

For more reference see Apple Documentation for UICollectionViewLayout

这篇关于UICollectionView自定义流布局在滚动时崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆