【问题标题】:Using UIPanGestureRecognizer to swipe down UIView使用 UIPanGestureRecognizer 向下滑动 UIView
【发布时间】:2018-06-22 12:27:05
【问题描述】:

我的UIView 中有一个UIPanGestureRecognizerIBAction,我能够处理手势并识别从开始、取消和结束的状态变化,并响应这些变化。

但是,当使用sender.location 处理向下滑动时,UIView 在手势开始后实际上向上移动,然后继续向下移动。这种经历令人不安,我不确定我做错了什么。有人有什么想法吗?

func update(_ translation: CGPoint, origin: CGPoint) {

    let offSetY = translation.y

    cardView.frame.origin.y = offSetY

    let multiplier = 1 - (translation.y / 2000)
    self.view.alpha = multiplier
}


func cancel(_ origin: CGPoint) {

    let animator = UIViewPropertyAnimator(duration: 0.6, dampingRatio: 0.6) {
        self.visualEffectView.alpha = 1
        self.cardView.alpha = 1.0
        self.view.alpha = 1.0
        self.cardView.center = origin
    }
    animator.startAnimation()
}

func finish() {
    let animator = UIViewPropertyAnimator(duration: 0.9, dampingRatio: 0.9) {
        self.visualEffectView.effect = nil
        self.dismiss(animated: true, completion: nil)
    }
    animator.startAnimation()
}



@IBAction func panGestureAction(_ sender: UIPanGestureRecognizer) {

    self.view.backgroundColor = .white
    let originalCardPosition = cardView.center

   //let cardOriginY = cardView.frame.origin.y
    let translation = sender.translation(in: self.cardView)
    let origin = sender.location(in: self.cardView)

        switch sender.state {
        case .changed:


            if translation.y > 0 { update(translation, origin: origin) }

        case .ended:

            let translation = sender.translation(in: self.cardView)

            if translation.y > 100 {

                finish()

            } else {
                cardView.alpha = 1.0
                cancel(originalCardPosition)

            }
        case .cancelled:
            cancel(originalCardPosition)

        default: break
        }

}

【问题讨论】:

    标签: ios uiview uipangesturerecognizer


    【解决方案1】:

    问题是你将cardVieworigin.y直接设置为translation.y的值。您需要将translation.y 添加到手势开始时确定的视图的原始y 值。

    给类添加一个属性:

    var originalY: CGFloat = 0
    

    然后在手势的.began状态下,设置:

    originalY = cardView.frame.origin.y
    

    然后在您的update 方法中设置原点:

    cardView.frame.origin.y = originalY + offSetY
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多