2016-10-19 3 views
7

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

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

Как this flowout Например:

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

+0

Я знаю, что это очень банальный вопрос, но я осмелюсь спросить его. Правильно ли вы настроили свой собственный класс в макете своего коллектора? – Adeel

+0

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

+0

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

ответ

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 
    } 

} 
+0

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

+0

@MohammadAbdurraafay да, также если мы используем пользовательский flowlayout, тогда он будет называть это переопределяющее func. –

+0

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

Смежные вопросы