Я сделал галерею с помощью 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)
}
}
В настоящее время функция выполняется только один раз при запуске приложения. Вы знаете, как запускать эту функцию каждый раз, когда я хочу?
Я добавил viewDidLoad () в последнюю строку.
Обновите код для рассматриваемого источника данных collectionView и метода делегата.
вы звоните collectionView.reloadData(), когда хотите его обновить?
Я добавил код. Да, я пробовал reloadData () внутри функции обновления, но ничего не произошло.
Вы пропустили artCollectionView.collectionViewLayout = layout?
Я не писал ничего, кроме viewDidLoad ().





Вам необходимо реализовать 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()
Вы написали строку yourCollectionView.delegate = self в своем коде?