У меня есть 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)
}