Как предварительно выбрать ячейки представления коллекции, которые не видны на экране - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть collectionView, и я добавил Pan gesture на весь вид.На первом этапе высота collectionView составляет 3/4 экрана.Когда пользователь перемещается по экрану, высота collectionView увеличивается для всего экрана, а затем включается прокрутка collectionView.

(Теперь впервые высота collectionView странно меняется послевсе работает нормально.) Думаю, проблема в том, что collectionViewCell не загружается в первый раз, поэтому требуется время для загрузки. После того, как collectionView загружен правильно, все работает нормально.

здеськод

@objc private func bottomViewPanned(recognizer: UIPanGestureRecognizer) {

    switch recognizer.state {
    case .began:

        self.animateTransitionIfNeeded(to: self.currentState.opposite, duration: 1)
        runningAnimators.forEach { $0.pauseAnimation() }
        animationProgress = runningAnimators.map { $0.fractionComplete }
    case .changed:
        let yVelocity = recognizer.velocity(in: profileCollectionView).y
        let shouldClose = yVelocity > 0

        let translation = recognizer.translation(in: profileCollectionView)
        var fraction = -translation.y / popupOffset
        if currentState == .open { fraction *= -1 }
        if runningAnimators[0].isReversed { fraction *= -1 }
        for (index, animator) in runningAnimators.enumerated() {
            animator.fractionComplete = fraction + animationProgress[index]
        }
    case .ended:
        let yVelocity = recognizer.velocity(in: profileCollectionView).y
        let shouldClose = yVelocity > 0
        if yVelocity == 0 {
            runningAnimators.forEach { $0.continueAnimation(withTimingParameters: nil, durationFactor: 0) }
            break
        }
        switch currentState {
        case .open:
            if !shouldClose && !runningAnimators[0].isReversed { runningAnimators.forEach { $0.isReversed = !$0.isReversed } }
            if shouldClose && runningAnimators[0].isReversed { runningAnimators.forEach { $0.isReversed = !$0.isReversed } }
        case .closed:
            if shouldClose && !runningAnimators[0].isReversed { runningAnimators.forEach { $0.isReversed = !$0.isReversed } }
            if !shouldClose && runningAnimators[0].isReversed { runningAnimators.forEach { $0.isReversed = !$0.isReversed } }

        }
        runningAnimators.forEach { $0.continueAnimation(withTimingParameters: nil, durationFactor: 0) }

    default:
        ()
    }
}


func animateTransitionIfNeeded(to state: state, duration: TimeInterval , panningDown : Bool = true) {

    guard runningAnimators.isEmpty else { return }
    let transitionAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 1.0, animations: {
        switch state {

        case .open:
            self.topConstraint.constant = 0.0


        case .closed:
            self.topConstraint.constant = initialheight

        }
        self.view.layoutIfNeeded()
    })

    // the transition completion block
    transitionAnimator.addCompletion { position in

        // update the state
        switch position {
        case .start:
            self.currentState = state.opposite
        case .end:
            self.currentState = state
        case .current:
            ()
        }

        // manually reset the constraint positions
        switch self.currentState {
        case .open:

            self.topConstraint.constant = 0.0

        case .closed:
            self.topConstraint.constant = initialheight
        }
        self.runningAnimators.removeAll()
    }
    transitionAnimator.startAnimation()
    runningAnimators.append(transitionAnimator)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...