Вызов collectionview (_: layout: sizeforitemat :) в swift 4

Я сделал галерею с помощью UICollectionView.

Если вы опустите экран, изображение должно продолжать выходить и остановиться на 20.

Код постоянно обновлялся. Однако функция collectionView (_: layout: sizeForItemAt :), устанавливающая размер ячейки, не работала. Следовательно, непрерывно отображается только 20 изображений.

На viewDidLoad ()

if let layoutt = artCollectionView?.collectionViewLayout as? PinterestLayout
{
    layoutt.delegate = self
}

настройка ячейки

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeCollectionViewCell", for: indexPath) as? HomeCollectionViewCell,

    let arts = self.artList else { return HomeCollectionViewCell() }
    if arts.count > indexPath.row
    {
        let model = arts[indexPath.row]

        cell.imgView.sd_setImage(with: URLHelper.createEncodedURL(url: model.thumburl), completed: nil)
    }
    return cell
}

вернуть размер ячейки

extension HomeViewController : PinterestLayoutDelegate
{
    func collectionView(_ collectionView: UICollectionView, heightForPhotoAtIndexPath indexPath:IndexPath) -> CGFloat
    {
        return CGFloat(300.0)
    }
}

В настоящее время функция выполняется только один раз при запуске приложения. Вы знаете, как запускать эту функцию каждый раз, когда я хочу?

Вы написали строку yourCollectionView.delegate = self в своем коде?

Sateesh Yemireddi 26.10.2018 09:42

Я добавил viewDidLoad () в последнюю строку.

Enkha 26.10.2018 09:44

Обновите код для рассматриваемого источника данных collectionView и метода делегата.

Sateesh Yemireddi 26.10.2018 09:47

вы звоните collectionView.reloadData(), когда хотите его обновить?

kbunarjo 26.10.2018 09:48

Я добавил код. Да, я пробовал reloadData () внутри функции обновления, но ничего не произошло.

Enkha 26.10.2018 09:55

Вы пропустили artCollectionView.collectionViewLayout = layout?

Sateesh Yemireddi 26.10.2018 10:08

Я не писал ничего, кроме viewDidLoad ().

Enkha 26.10.2018 10:14
3
7
7 909
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам необходимо реализовать UICollectionViewDelegateFlowLayout. Вы можете узнать больше о протоколе здесь: Протокол UICollectionViewDelegateFlowLayout

Пример:

extension viewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 50, height: 300)
    }
}
Ответ принят как подходящий

Пожалуйста, следуйте инструкциям по установке PinterestLayout в UICollectionView ниже.

Установите PinterestLayout в представление вашей коллекции.

let layout = PinterestLayout()
collectionView.collectionViewLayout = layout

Макет установки

layout.delegate = self
layout.cellPadding = 5
layout.numberOfColumns = 2

Реализуйте методы PinterestLayoutDelegate

extension CustomCollectionVC: PinterestLayoutDelegate {

    func collectionView(collectionView: UICollectionView,
                        heightForImageAtIndexPath indexPath: IndexPath,
                        withWidth: CGFloat) -> CGFloat {
        let image = images[indexPath.item]

        return image.height(forWidth: withWidth)
    }

    func collectionView(collectionView: UICollectionView,
                        heightForAnnotationAtIndexPath indexPath: IndexPath,
                        withWidth: CGFloat) -> CGFloat {
        let textFont = UIFont(name: "Arial-ItalicMT", size: 11)!                
        return "Some text".heightForWidth(width: withWidth, font: textFont)
    }
}

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

collectionView.collectionViewLayout.invalidateLayout()
collectionView.reloadData()

Наблюдение:

func collectionView(_ collectionView: UICollectionView, heightForPhotoAtIndexPath indexPath:IndexPath) -> CGFloat

попробуйте это вместо вышеуказанного:

func collectionView(collectionView: UICollectionView,
                        heightForImageAtIndexPath indexPath: IndexPath,
                        withWidth: CGFloat) -> CGFloat

Если вы посмотрите на метод prepare () класса PinterestLayout, вы можете увидеть приведенный ниже код

guard
    cache.isEmpty == true,
    let collectionView = collectionView
    else {
      return
}

Когда вы перезагружаете colectionView, кеш больше не пуст, поэтому он возвращается без изменения макета.

Так что просто удалите значение кеша при вызове prepare. Добавить removeAll () перед охранником

cache.removeAll()

Другие вопросы по теме