在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)

文章完毕。