我有
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
}
}