Изменить начальные / конечные точки отказов UICollectionView - PullRequest
0 голосов
/ 17 ноября 2018

Обычно UICollectionView начинает отскок при прокрутке мимо его contentSize, т.е. когда contentOffset < 0 или contentOffset > contentSize.width для горизонтальной ориентации.

Можно ли изменить это поведение, чтобы эффект отскока начинался при прокрутке, скажем, 10-го элемента (когда contentOffset < itemSize.Width * 10 или contentOffset > contentSize.width - (itemSize.Width * 10))?

ОБНОВЛЕНИЕ 1:
@OverD - спасибо, что указал мне правильное направление.

Я закончил с работой в scrollViewWillEndDragging и настроил targetContentOffset при необходимости.

Проблема, с которой я все еще сталкиваюсь, заключается в том, что анимация отскока не является плавной , как исходный отскок при достижении конца contenSize.

Есть идеи, чего не хватает? Фрагмент кода ниже:

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

        let numberOfBouncingCells = 10
        let extraSectionWidth = (collectionViewFlowLayout.itemSize.width + collectionViewFlowLayout.minimumLineSpacing) * numberOfBouncingCells

        let startXOffset = extraSectionWidth
        let endXOffset = collectionView.contentSize.width - 2 * extraSectionWidth

        let yOffset = collectionView.contentOffset.y

        if targetContentOffset.pointee.x < startXOffset {
            targetContentOffset.pointee = CGPoint(x: startXOffset, y: yOffset)
        } else if targetContentOffset.pointee.x > endXOffset {
            targetContentOffset.pointee = CGPoint(x: endXOffset, y: yOffset)
        }

    }

ОБНОВЛЕНИЕ 2 (для ответа):

См. Ответ ниже, я отказался от подхода scrollViewWillEndDragging в пользу простого изменения collectionView.contentInset [.left, .right]

1 Ответ

0 голосов
/ 18 ноября 2018

В конце концов я ответил на свой вопрос.

Мне нужно было установить collectionView.contentInset [.left, .right] для достижения ожидаемого поведения.

var collectionViewFlowLayout: UICollectionViewFlowLayout {
    return collectionView.collectionViewLayout as! UICollectionViewFlowLayout
}

let numberOfBouncingCells = 10
let extraBouncingWidth = (collectionViewFlowLayout.itemSize.width + collectionViewFlowLayout.minimumLineSpacing) * numberOfBouncingCells

collectionView.contentInset.left = -extraBouncingWidth
collectionView.contentInset.right = -extraBouncingWidth
...