интерактивная анимация с PanGesture iOS - PullRequest
0 голосов
/ 25 мая 2018

У меня есть sheetView, верхний край которого всегда центрирован по центру родительских видов.

Я разрешаю перетаскивать его вертикально, используя жест панорамирования, а когда жест заканчивается, я анимирую sheetView обратно в центр родительского вида..

Но я хочу взаимодействовать с sheetView, пока он еще анимируется, и менять его положение по вертикали при панорамировании. Но я не могу этого сделать, он всегда заканчивает текущую анимацию и затем запускает следующую анимацию.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    sheetView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
    middlePoint = CGPoint(x: view.bounds.midX, y: view.bounds.height)
    sheetView.center = middlePoint
}

@IBAction func handlePan(_ sender: UIPanGestureRecognizer) {
    let recognizer = sender
    let translation = recognizer.translation(in: self.view)

    if recognizer.state == .began {
        if animator.isRunning {
            animator.stopAnimation(true)
        }
        animator.addAnimations {
            self.sheetView.center = self.middlePoint
        }
        animator.pauseAnimation()
    } else if recognizer.state == .changed {
        self.sheetView.center.y += translation.y

    } else if recognizer.state == .ended || recognizer.state == .cancelled {
        if animator.isRunning {
            animator.stopAnimation(true)
        }
        animator.addAnimations {
            self.sheetView.center = self.middlePoint
        }
        animator.startAnimation()
    }

    recognizer.setTranslation(CGPoint.zero, in: self.view)
}

Вы можете найти весь проект здесь: sheetView

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Это потому, что вы всегда применяете анимацию.Даже когда вы перемещаете вид, который не требуется.Эта анимация вызывает перерыв при перемещении вида.

    @IBAction func handlePan(_ sender: UIPanGestureRecognizer) {
        let recognizer = sender
        let translation = recognizer.translation(in: self.view)

        if recognizer.state == .began{
                self.sheetView.center = self.middlePoint
        } else if recognizer.state == .changed{
            self.sheetView.center.y += translation.y

        }else if recognizer.state == .ended || recognizer.state == .cancelled{
            if animator.isRunning{
                animator.stopAnimation(true)
            }
            animator.addAnimations {
                self.sheetView.center = self.middlePoint
            }
            animator.startAnimation()
        }

        recognizer.setTranslation(CGPoint.zero, in: self.view)

    }
0 голосов
/ 25 мая 2018

@ objc func panGestureAction (_ gestRecognizer: UIPanGestureRecognizer) {

    guard gestureRecognizer.view != nil else {return}

    let directionVelocity = gestureRecognizer.velocity(in: myView)

    switch gestureRecognizer.state {

    case .changed:

        if directionVelocity.x > 0 {

            //print("swipe right")
        }

        if directionVelocity.x < 0 {

            //print("swipe left")
        }

        if directionVelocity.y > 0 {

            //print("swipe down")

        }

        if directionVelocity.y < 0 {

            //print("swipe up")

        }
        break

    case .ended :

       //print(“Ended”)  

    default:
        break
    }

}

Надеюсь, это поможет вам.

...