iOS UIGestureRecognizer:掌握多种手势交互

3,065 阅读4分钟

在iOS应用开发中,用户交互是提供优秀用户体验的关键。UIGestureRecognizer是UIKit框架中的一个强大工具,它可以识别并响应用户的各种手势操作。

1.什么是UIGestureRecognizer

UIGestureRecognizer是UIKit框架中的一个基类,用于识别并响应用户的手势操作。它提供了一系列具体的手势子类,如UITapGestureRecognizerUIPanGestureRecognizerUISwipeGestureRecognizer等,每个子类专门用于识别不同类型的手势。

2.常见的手势子类

UIGestureRecognizer框架提供了多种手势子类,每种子类都可以用于特定的手势识别。以下是一些常见的手势子类及其应用场景:

UITapGestureRecognizer

用于识别点击手势,适用于单击、双击等操作。常用于实现点击图片放大、按钮点击等交互效果。

UIPanGestureRecognizer

用于识别平移手势,适用于拖拽、移动等操作。常用于实现拖拽视图、调整元素位置等功能。

UISwipeGestureRecognizer

用于识别滑动手势,适用于快速滑动屏幕的操作。常用于实现滑动删除、切换页面等功能。

UILongPressGestureRecognizer

用于识别长按手势,适用于长时间按住屏幕的操作。常用于实现弹出菜单、拖拽排序等功能。

UIRotationGestureRecognizer

用于识别旋转手势,适用于两指旋转操作。常用于实现旋转视图、调整元素角度等功能。

3.使用UIGestureRecognizer

要使用UIGestureRecognizer,您需要以下几个步骤:

  1. 创建一个具体的手势子类实例,例如UITapGestureRecognizer
  2. 打开Main.storyboard,拖拽一个UIView或其他UI元素到界面上,作为您要添加手势的视图。
  3. 在Attributes Inspector中,展开"Gesture Recognizers",点击"+"按钮添加一个Tap Gesture Recognizer
  4. Ctrl+拖拽手势到相应的视图控制器代码中,创建一个@IBAction方法。

使用代码

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        if sender.state == .ended {
            // 在此处添加处理点击操作的代码
        }
    }
}

4.响应点击事件

当用户轻触目标UI元素时,UITapGestureRecognizer将触发您预先指定的处理方法。在上述示例中,我们在handleTap方法中处理点击事件。需要注意的是,我们通过检查sender.state来确保仅在手势结束时执行操作。

5.手势识别参数

UITapGestureRecognizer提供了一些属性,允许您对手势的识别进行进一步的配置:

  • numberOfTapsRequired:设置需要的点击次数,默认为1,您可以设置为2来实现双击手势。
  • numberOfTouchesRequired:设置需要的手指数,默认为1。

这些属性允许您根据需要定制手势的响应方式。

6.不同种类的UITapGestureRecognizer

UITapGestureRecognizer支持不同种类的点击手势,让您能够更灵活地满足用户需求:

单击手势

let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap(_:)))
singleTapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTapGesture)

双击手势

let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(_:))) doubleTapGesture.numberOfTapsRequired = 2 view.addGestureRecognizer(doubleTapGesture)

多次点击手势

let multipleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleMultipleTap(_:)))
multipleTapGesture.numberOfTapsRequired = 3
view.addGestureRecognizer(multipleTapGesture)

7.其他常见的手势子类及应用场景

UIPanGestureRecognizer

UIPanGestureRecognizer用于识别平移手势,适用于拖拽、移动等操作。常用于实现拖拽视图、调整元素位置等功能。

示例:拖拽视图

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var draggableView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func handlePan(_ sender: UIPanGestureRecognizer) {
        let translation = sender.translation(in: self.view)
        draggableView.center = CGPoint(x: draggableView.center.x + translation.x, y: draggableView.center.y + translation.y)
        sender.setTranslation(.zero, in: self.view)
    }
}

UISwipeGestureRecognizer

UISwipeGestureRecognizer用于识别滑动手势,适用于快速滑动屏幕的操作。常用于实现滑动删除、切换页面等功能。

示例:切换图片

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    let images = [UIImage(named: "image1"), UIImage(named: "image2"), UIImage(named: "image3")]
    var currentIndex = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeRight(_:)))
        swipeRightGesture.direction = .right
        imageView.addGestureRecognizer(swipeRightGesture)

        imageView.isUserInteractionEnabled = true
    }

    @objc func handleSwipeLeft(_ sender: UISwipeGestureRecognizer) {
        currentIndex = (currentIndex + 1) % images.count
        imageView.image = images[currentIndex]
    }

    @objc func handleSwipeRight(_ sender: UISwipeGestureRecognizer) {
        currentIndex = (currentIndex - 1 + images.count) % images.count
        imageView.image = images[currentIndex]
    }
}

UILongPressGestureRecognizer

UILongPressGestureRecognizer用于识别长按手势,适用于长时间按住屏幕的操作。常用于实现弹出菜单、拖拽排序等功能。

示例:弹出菜单

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var longPressView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func handleLongPress(_ sender: UILongPressGestureRecognizer) {
        if sender.state == .began {
            // 显示弹出菜单
        }
    }
}

UIRotationGestureRecognizer

UIRotationGestureRecognizer用于识别旋转手势,适用于两指旋转操作。常用于实现旋转视图、调整元素角度等功能。

示例:旋转视图

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var rotatableView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func handleRotation(_ sender: UIRotationGestureRecognizer) {
        rotatableView.transform = rotatableView.transform.rotated(by: sender.rotation)
        sender.rotation = 0
    }
}

多手势的处理

有时候,您可能需要处理多个手势的同时触发。在这种情况下,可以使用require(toFail:)方法来设置手势之间的优先级关系。例如,您可以使一个手势在另一个手势失败时才被触发。

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:)))

// 设置 swipeGesture 依赖于 panGesture 失败时才触发
swipeGesture.require(toFail: panGesture)

view.addGestureRecognizer(panGesture)
view.addGestureRecognizer(swipeGesture)

文章结束。