Проверьте, полностью ли отображается ячейка в виде коллекции - PullRequest
0 голосов
/ 30 октября 2018

У меня есть представление коллекции, где размер ячейки соответствует размеру коллекции, поэтому каждая ячейка должна занимать весь экран. Я реализовал функциональность, при которой ячейка привязывается к полному виду всякий раз, когда она перетаскивается или замедляется при прокрутке. Вот как работает UX.

https://drive.google.com/open?id=1v8-WxCQUzfu8V_k9zM1UCWsf_-Zz4dpr

Что я хочу:

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

Ниже приведен код, который я написал для эффекта привязки:

func scrollToMostVisibleCell(){
    let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
    let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)!
    collectionView.scrollToItem(at: visibleIndexPath as IndexPath, at: .top, animated: true)
    print("cell is ---> ", visibleIndexPath.row)
}



func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    scrollToMostVisibleCell()
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    scrollToMostVisibleCell()
    if !decelerate {
        scrollToMostVisibleCell()
    }
}

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

Есть ли способ, где я могу проверить, полностью ли видна ячейка, и затем я могу выполнить функцию?

Я перебрал Интернет по этому вопросу, но не смог найти удовлетворительного ответа.

Ответы [ 2 ]

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

Вот полный пример полноэкранного контроллера представления с вертикальной прокруткой с включенной подкачкой (5 сплошных цветных ячеек). Когда ячейка «встала на место», она активирует scrollViewDidEndDecelerating, где вы можете получить индекс текущей ячейки и выполнять любые действия, которые вам нравятся.

Добавьте новый UICollectionViewController к вашей раскадровке и назначьте его класс VerticalPagingCollectionViewController. Нет необходимости изменять какие-либо настройки по умолчанию для контроллера в раскадровке - все это обрабатывается в коде ниже:

//
//  VerticalPagingCollectionViewController.swift
//
//  Created by Don Mag on 10/31/18.
//

import UIKit

private let reuseIdentifier = "Cell"

class VerticalPagingCollectionViewController: UICollectionViewController {

    private var collectionViewFlowLayout: UICollectionViewFlowLayout {
        return collectionViewLayout as! UICollectionViewFlowLayout
    }

    private var colors: [UIColor] = [.red, .green, .blue, .yellow, .orange]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Register cell classes
        self.collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        // enable paging
        self.collectionView?.isPagingEnabled = true

        // set section insets and item spacing to Zero
        collectionViewFlowLayout.sectionInset = UIEdgeInsets.zero
        collectionViewFlowLayout.minimumLineSpacing = 0
        collectionViewFlowLayout.minimumInteritemSpacing = 0
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if let cv = collectionViewLayout.collectionView {
            collectionViewFlowLayout.itemSize = cv.frame.size
        }
    }

    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        if let iPath = collectionView?.indexPathsForVisibleItems.first {
            print("DidEndDecelerating - visible cell is: ", iPath)
            // do what you want here...
        }
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return colors.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
        cell.backgroundColor = colors[indexPath.item]
        return cell
    }

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

Использование followedCollectionView.indexPathsForVisibleItems() для получения видимых ячеек visibleIndexPaths и проверки того, содержится ли indexPath в visibleIndexPaths или нет, прежде чем делать что-либо с ячейками. Ссылка: @anhtu Проверьте, видна ли ячейка в indexPath на экране UICollectionView

Также от Apple: var visibleCells: [UICollectionViewCell] { get }. Возвращает массив видимых ячеек, отображаемых в данный момент в виде коллекции.

...