0

Я реализую приложение с компоновкой столбцов в стиле Pinterest. И хотите, чтобы размер каждой ячейки был динамическим, соответствует размеру изображения.Размер обновления UICollectionView asyncly

Я использую SDWebImage для асинхронной загрузки изображения в ячейку, а затем недействительности макета коллекцииView. Однако, поскольку ячейки являются многоразовыми, и поэтому каждый раз, когда экран прокручивается вверх & вниз, макет становится недействительным и создается некоторая нежелательная анимация.

Вот мой код:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 


    var cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! MyCell 

    cell.imageView.sd_setImageWithURL(imageUrl, completed: { (image, error, _, _) -> Void in 
     UIView.animateWithDuration(0.3, animations: {() -> Void in 
      collectionView.collectionViewLayout.invalidateLayout() 
     }) 
    }) 
    return cell 
} 

Размер ячейки функции:

func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { 

    var width = UIScreen.mainScreen().bounds.size.width/2 - 3 
    // create a cell size from the image size, and return the size 
    if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? CraveCollectionViewCell{ 

     if cell.imageView.image != nil { 

      let image = cell.imageView.image! 
      var height = image.size.height * width/image.size.width 
      let size = CGSize(width: width, height: height) 
      var height1 = size.height > 160 ? size.height : 160 
      return CGSize(width: width, height: height1) 

     } 
    } 
    return CGSize(width: width, height: 160) 
} 

}

Когда изображения получает нагрузку сначала SDWebImage, collectionView.collectionViewLayout.invalidateLayout() называется и раскладка работает отлично.

После scolling collectionView.collectionViewLayout.invalidateLayout() вызывается снова, и здесь возникает проблема.

+1

Вы добавили эту анимацию: animateWithDuration, можете обойтись без анимации и проверить – Swati

+1

@Swati благодарит за ваш комментарий. Макет все еще недействителен каждый раз во время прокрутки, все еще можно увидеть, как происходит рывок. Я хочу найти способ избавиться от него. – Zeyu

ответ

0

Первоначально размер моей ячейки был рассчитан по изображению после того, как SDWebImage получил его, что является асинхронным и стало причиной рывка.

Чтобы решить проблему, сервер должен сначала вернуть размер изображения, чтобы размер ячейки не был рассчитан асинхронно.

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