#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 ознакомьтесь с моим решением, надеюсь, это поможет.