UICollectionViewLayout и метод layoutAttributesForItem никогда не вызываются

#ios #uicollectionviewlayout #flowlayout

#iOS #uicollectionviewlayout #flowlayout

Вопрос:

Я пытаюсь реализовать UICollectionViewFlowLayout или UICollectionViewLayout любыми способами, layoutAttributesForItem которые никогда не вызываются.

Я вижу от других, что они вызывают layoutAttributesForItem из self.layoutAttributesForItem .

Как этот вывод примера:

Я создал проект Playground, на который вы можете посмотреть. В целом я просто пытаюсь увеличить вид по центру.

Комментарии:

1. Я знаю, что это очень тривиальный вопрос, но я осмеливаюсь задать его. Правильно ли вы назначили свой пользовательский класс макету вашего CollectionView?

2. Спасибо, что спросили 🙂 Если у вас есть время, взгляните на эту игровую площадку: github.com/JCzz/CollectionView В целом я просто пытаюсь масштабировать представление в центре экрана.

3. @ChrisG. У меня такая же проблема. Все кажется прекрасным, за исключением того, что «LayoutAttributesForItem» вообще не запускается. Я не уверен, почему.

4. Я так и не нашел решения — дайте мне знать, если найдете. Я обнаружил, что документация могла бы быть лучше.

5. Кто-нибудь здесь нашел какое-либо решение этой проблемы?

Ответ №1:

Попробуйте использовать его, подклассировав UICollectionViewFlowLayout

 let flowLayout = LeftAgignedFlowLayout()
flowLayout.minimumLineSpacing = 18
flowLayout.minimumInteritemSpacing = 8
flowLayout.scrollDirection = .vertical
self.collectionViewLayout = flowLayout



class LeftAgignedFlowLayout : UICollectionViewFlowLayout {        

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let arr = super.layoutAttributesForElements(in: rect)!
        return arr.map {
            atts in 

            var atts = atts
            if atts.representedElementCategory == .cell {
                let ip = atts.indexPath
                atts = self.layoutAttributesForItem(at:ip)!
            }
            return atts
        }
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        var atts = super.layoutAttributesForItem(at:indexPath)!
        if indexPath.item == 0 {
            return atts 

        }
        if atts.frame.origin.x - 1 <= self.sectionInset.left {
            return atts 

        }
        let ipPv = IndexPath(item:indexPath.row-1, section:indexPath.section)
        let fPv = self.layoutAttributesForItem(at:ipPv)!.frame
        let rightPv = fPv.origin.x   fPv.size.width   self.minimumInteritemSpacing
        atts = atts.copy() as! UICollectionViewLayoutAttributes
        atts.frame.origin.x = rightPv
        return atts
    }

}
  

Комментарии:

1. Итак, что вы действительно предлагаете здесь, так это то, что мы вызываем layoutAttributesForItem(at:) себя вместо того, чтобы полагаться на UICollectionViewFlowLayout и ожидать обратного вызова? :/

2. @MohammadAbdurraafay да, также, если мы используем пользовательский flowlayout, он вызовет эту функцию переопределения.

3. Это лучший пример в Интернете (который я могу найти) layoutAttributesForItem в swift.

4. В любом случае это не решение, но подкласс FlowLayout ничего не изменил.

5. @alekop ознакомьтесь с моим решением, надеюсь, это поможет.