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

Swift 4为UIView添加自定义圆形[关闭]

UIGestureRecognizer 键值编码

swift [Swift Notes]在学习Swift #Swift的同时收集笔记

Swift 反射