使用 UIPanGestureRecognizer 向下滑动 UIView
Using UIPanGestureRecognizer to swipe down UIView
我的 UIView
中有一个 UIPanGestureRecognizer
的 IBAction
,我能够处理手势并识别状态从开始、取消和结束的变化,以及响应这些变化。
然而,当使用 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
}
}
问题是你把cardView
的origin.y
直接设置成了translation.y
的值。您需要将 translation.y
添加到手势开始时确定的视图原始 y
值。
在class中添加一个属性:
var originalY: CGFloat = 0
然后在手势的.began
状态下,设置:
originalY = cardView.frame.origin.y
然后在您的 update
方法中设置原点:
cardView.frame.origin.y = originalY + offSetY
我的 UIView
中有一个 UIPanGestureRecognizer
的 IBAction
,我能够处理手势并识别状态从开始、取消和结束的变化,以及响应这些变化。
然而,当使用 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
}
}
问题是你把cardView
的origin.y
直接设置成了translation.y
的值。您需要将 translation.y
添加到手势开始时确定的视图原始 y
值。
在class中添加一个属性:
var originalY: CGFloat = 0
然后在手势的.began
状态下,设置:
originalY = cardView.frame.origin.y
然后在您的 update
方法中设置原点:
cardView.frame.origin.y = originalY + offSetY