使用 UIPanGestureRecognizer 获取视图的翻译 - 快速 - 以编程方式
Posted
技术标签:
【中文标题】使用 UIPanGestureRecognizer 获取视图的翻译 - 快速 - 以编程方式【英文标题】:Getting Translation of view with UIPanGestureRecognizer - swift - programmatically 【发布时间】:2020-09-29 14:39:39 【问题描述】:我正在使用 UIPanGestureRecognizer 方法翻译视图:
@objc fileprivate func handlePan(_ gestureRecognizer : UIPanGestureRecognizer)
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed
makeDisappearButtons()
deletebox.isHidden = false
let translation = gestureRecognizer.translation(in: self.view)
// note: 'view' is optional and need to be unwrapped
gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
gestureRecognizer.setTranslation(CGPoint.zero, in: self.view)
if gestureRecognizer.view!.frame.intersects(deletebox.frame)
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations:
gestureRecognizer.view!.transform = .init(scaleX: 0.6, y: 0.6)
self.deletebox.transform = .init(scaleX: 1.2, y: 1.2)
, completion: nil)
else
gestureRecognizer.view!.setNeedsDisplay()
gestureRecognizer.setTranslation(.zero, in: self.view)
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations:
self.deletebox.transform = .identity
gestureRecognizer.view!.transform = .identity
, completion: nil)
if gestureRecognizer.state == .ended
makeButtonsReAppear()
if gestureRecognizer.view!.frame.intersects(deletebox.frame)
gestureRecognizer.view!.isHidden = true
gestureRecognizer.view?.removeFromSuperview()
else
gestureRecognizer.view!.setNeedsDisplay()
gestureRecognizer.setTranslation(.zero, in: self.view)
gestureRecognizer.view!.transform = .identity
print(gestureRecognizer.translation(in: self.view))
deletebox.isHidden = true
我想知道 GestureRecognizer.state == .ended 中视图的翻译,但是当我尝试将其打印出来时,它是 x:0, y:0。
【问题讨论】:
【参考方案1】:每次手势处理程序调用 changed
时,您都将翻译设置回 .zero
。
gestureRecognizer.setTranslation(.zero, in: self.view)
但是,当手指抬起时,状态变为ended
,到那时翻译不再改变。
documentation 说:
当用户的手指离开屏幕时,手势识别器进入 UIGestureRecognizer.State.ended 状态。
所以在最后一次changed
调用和ended
上的翻译是相同 - 因为你已经设置了gestureRecognizer.view
的框架在changed
内,你不需要在ended
内做任何事情。
【讨论】:
【参考方案2】:你从哪里调用了这个方法,可以放在viewDidAppear中试试。否则调用 setNeedsDisplay 和 LayoutIfNeeded 方法。
【讨论】:
此方法由手势识别器调用,而不是手动调用。我认为setNeedsDisplay
或layoutIfNeeded
也不会产生任何影响。
手势识别器调用该方法以上是关于使用 UIPanGestureRecognizer 获取视图的翻译 - 快速 - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 UIPanGestureRecognizer 移动对象时会有延迟?
UIPanGestureRecognizer ***视图未获取事件,子视图使用它们
在 UITableView 上滑动删除以使用 UIPanGestureRecognizer
在 UIPanGestureRecognizer 中使用velocityInView