Вызовите collectionViewView (_: layout: sizeForItemAt :) в Swift 4 - PullRequest
0 голосов
/ 26 октября 2018

Я сделал галерею, используя UICollectionView.

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

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

On 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)
    }
}

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Пожалуйста, следуйте инструкциям, чтобы установить 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
0 голосов
/ 26 октября 2018

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

Пример:

extension viewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 50, height: 300)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...