Collectionview the end Draging Position не останавливается на каждой ячейке - PullRequest
1 голос
/ 24 мая 2019

кто-нибудь может мне помочь?У меня есть представление «Коллекция» со вставками, горизонтальное направление прокрутки, включение подкачки и отсутствие пробелов между ячейками.И проблема в том, что подкачка не останавливается на каждой ячейке.

Я перепробовал все возможные решения, которые я могу найти в StackOverflow и World Wide Web, но ничего не работает.Я использую Xcode 10 и Swift5, и это для приложения iPhone.Я не добавляю свой код collectionViewcell, потому что он имеет только IBoutlet для метки.

 class ViewController: UIViewController, UICollectionViewDataSource, 
     UICollectionViewDelegate {

 @IBOutlet weak var collectionView: UICollectionView!

    private let item = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday", "Sunday"]
    private let cellScaling: CGFloat = 0.33
    private var cellWidth: CGFloat = 0


    override func viewDidLoad() {
        super.viewDidLoad()

        UpdateUI()
    }

    func UpdateUI(){
        self.collectionView.backgroundColor = UIColor.white

        let screenSize = UIScreen.main.bounds.size
        let cellWidth = floor(screenSize.width * cellScaling)
        let insetX = (view.bounds.width - cellWidth) / 2
        let layout = collectionView!.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: cellWidth, height: collectionView.bounds.height)

        collectionView.contentInset = UIEdgeInsets(top: 0, left: insetX, bottom: 0, right: insetX)

     // layout.minimumLineSpacing = 0
        self.cellWidth = cellWidth
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

        cell.label.text = self.item[indexPath.row]
        cell.backgroundColor = UIColor.cyan

        return cell
    }

    private var startingScrollingOffset = CGPoint.zero

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        startingScrollingOffset = scrollView.contentOffset
    }

    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        let page: CGFloat
        let offset = scrollView.contentOffset.x + scrollView.contentInset.left
        let proposedPage = offset / max(1, cellWidth)
        let snapPoint: CGFloat = 0.1
        let snapDelta: CGFloat = offset > startingScrollingOffset.x ? (1-snapPoint) : snapPoint

        if floor(proposedPage + snapDelta) == floor(proposedPage){
            page = floor(proposedPage)
        } else {
            page = floor(proposedPage + 1)
        }

        targetContentOffset.pointee = CGPoint(x: cellWidth * page, y: targetContentOffset.pointee.y)

    }
}

введите описание изображения здесь

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

1 Ответ

0 голосов
/ 24 мая 2019

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

   func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        let layout = theNameOfYourCollectionView.collectionViewLayout as! UICollectionViewFlowLayout 
        let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing // Calculate cell size
        let offset = scrollView.contentOffset.x
        let index = (offset + scrollView.contentInset.left) / cellWidthIncludingSpacing // Calculate the cell need to be center

        if velocity.x > 0 { // Scroll to -->
            targetContentOffset.pointee = CGPoint(x: ceil(index) * cellWidthIncludingSpacing - scrollView.contentInset.right, y: -scrollView.contentInset.top)
        } else if velocity.x < 0 { // Scroll to <---
            targetContentOffset.pointee = CGPoint(x: floor(index) * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)
        } else if velocity.x == 0 { // No dragging
            targetContentOffset.pointee = CGPoint(x: round(index) * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)
        }
    }

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

Убедитесь, что у вас есть pagingEnabled вашего collectionView в false, если вы хотите использовать этот код.

Надеюсь, я вам помогу!

...