有没有继承获得UICollectionViewFlowLayout属性的更好方法

时间:2017-09-04 10:09:04

标签: ios swift uicollectionview uicollectionviewlayout

我有

class MyCollectionViewLayoutA: UICollectionViewFlowLayout
class MyCollectionViewLayoutB: UICollectionViewFlowLayout

所以我想向UICollectionViewFlowLayout添加一个函数来获取其原始布局属性。

我知道可以使用UICollectionViewFlowLayout的子类来完成,但有没有更好的方法呢?

我尝试使用扩展程序,但super.layoutAttributesForItem(at: indexPath)将返回nil,而self.layoutAttributesForItem(at: indexPath)将调用其子类实现。

我还尝试使用扩展来创建具有默认实现的协议,但self.layoutAttributesForItem(at: indexPath)也将调用其子类实现,而 super不能在类成员之外使用

这是我的代码:

extension UICollectionViewFlowLayout {
    func originalLayoutAttributes() -> [Int: [UICollectionViewLayoutAttributes]]? {
        guard let collectionView = self.collectionView else { return nil }
        let numberOfSections = collectionView.numberOfSections
        if numberOfSections <= 0 {
            return nil
        }

        var sectionItemAttributes = [Int: [UICollectionViewLayoutAttributes]]()
        for section in 0 ..< numberOfSections {
            var attributesArray = [UICollectionViewLayoutAttributes]()
            for index in 0 ..< collectionView.numberOfItems(inSection: section) {
                let indexPath = IndexPath(item: index, section: section)
                var itemAttributes: UICollectionViewLayoutAttributes?
                itemAttributes = super.layoutAttributesForItem(at: indexPath)
                //itemAttributes = self.layoutAttributesForItem(at: indexPath)
                attributesArray.append(itemAttributes)
            }
            sectionItemAttributes[section] = attributesArray.isEmpty ? nil : attributesArray
        }
        return sectionItemAttributes.isEmpty ? nil : sectionItemAttributes
    }
}

0 个答案:

没有答案