Swift UIGestureRecogniser 跟随手指
Posted
技术标签:
【中文标题】Swift UIGestureRecogniser 跟随手指【英文标题】:Swift UIGestureRecogniser follow finger 【发布时间】:2014-08-26 10:26:27 【问题描述】:我正在使用 Swift 制作一个 ios8 应用程序。我希望用户能够使用手势来显示界面的某些部分。例如,用户向上滑动手指,他们向上滑动手指的视图移开,跟随手指显示下方的另一个视图。
我想要的是一个手势,它可以提供类似于通知框的结果,您可以从屏幕顶部下拉。我一直在查看文档,但似乎找不到合适的手势。
我看到一个叫做 UISwipeGestureRecogniser,但唯一的问题是,它不跟随你的手指,它只是在我向上/向下滑动手指时运行一个函数。
这是文档页面: https://developer.apple.com/documentation/uikit/uigesturerecognizer
【问题讨论】:
【参考方案1】:您正在寻找 UIPanGestureRecognizer。您将找到 Apple 文档here。
这是一个示例处理程序,它将用您的手指移动视图。在Interface Builder 中,将UIPanGestureRecognizer
添加到您希望能够拖动的视图中。将代理设置为您的ViewController
。将操作设置为此操作:
Swift 2.X:
@IBAction func handlePan(gestureRecognizer: UIPanGestureRecognizer)
if gestureRecognizer.state == .Began || gestureRecognizer.state == .Changed
let translation = gestureRecognizer.translationInView(self.view)
// note: 'view' is optional and need to be unwrapped
gestureRecognizer.view!.center = CGPointMake(gestureRecognizer.view!.center.x + translation.x, gestureRecognizer.view!.center.y + translation.y)
gestureRecognizer.setTranslation(CGPointMake(0,0), inView: self.view)
斯威夫特 3:
@IBAction func handlePan(_ gestureRecognizer: UIPanGestureRecognizer)
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed
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)
当然,您可以通过编程方式添加UIPanGestureRecognizer
:
在viewDidLoad
中为您的ViewController
创建识别器并将其添加到您希望能够拖动的视图中:
let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
self.someDraggableView.addGestureRecognizer(gestureRecognizer)
【讨论】:
你能解释一下gestureRecognizer.setTranslation(CGPointMake(0,0), inView: self.view)吗?我理解上面的那一行,但我无法理解为什么我们需要一个 CGPointZero 来进行识别器的翻译 @Happiehappie,handlePan 处理程序在用户移动手指时被重复调用。默认情况下,翻译会告诉您自触摸开始以来您移动了多远。由于我们使用了gestureRecognizer来拖动视图并且我们已经考虑了平移,我们将它设置回零,以便下次调用handlePan时它将报告触摸从上一次调用handlePan移动了多远。 这些天来,您很可能/几乎必须使用 NSLayoutConstraint 并轻松更改它的值以滑动项目。 @Fattie 怎么样?有什么例子吗? 嗨@J.Doe - “动画约束”是iOS编程中最基本的事情之一 - 你一直在做。例如,这是我的名人!关于“出现键盘时移动屏幕”的问题,解释如何做到这一点的答案:***.com/a/41808338/294884以上是关于Swift UIGestureRecogniser 跟随手指的主要内容,如果未能解决你的问题,请参考以下文章
UIGestureRecogniser 使用 IF 语句 Xcode
使用 UIGestureRecogniser 子类化时未调用 Touches Ended