在iOS运用开发中,用户交互是供给优秀用户体会的要害。UIGestureRecognizer
是UIKit结构中的一个强壮东西,它可以辨认并呼运用户的各种手势操作。
1.什么是UIGestureRecognizer
UIGestureRecognizer
是UIKit结构中的一个基类,用于辨认并呼运用户的手势操作。它供给了一系列详细的手势子类,如UITapGestureRecognizer
、UIPanGestureRecognizer
、UISwipeGestureRecognizer
等,每个子类专门用于辨认不同类型的手势。
2.常见的手势子类
UIGestureRecognizer
结构供给了多种手势子类,每种子类都可以用于特定的手势辨认。以下是一些常见的手势子类及其运用场景:
UITapGestureRecognizer
用于辨认点击手势,适用于单击、双击等操作。常用于完成点击图片扩大、按钮点击等交互效果。
UIPanGestureRecognizer
用于辨认平移手势,适用于拖拽、移动等操作。常用于完成拖拽视图、调整元素方位等功能。
UISwipeGestureRecognizer
用于辨认滑动手势,适用于快速滑动屏幕的操作。常用于完成滑动删除、切换页面等功能。
UILongPressGestureRecognizer
用于辨认长按手势,适用于长期按住屏幕的操作。常用于完成弹出菜单、拖拽排序等功能。
UIRotationGestureRecognizer
用于辨认旋转手势,适用于两指旋转操作。常用于完成旋转视图、调整元素角度等功能。
3.运用UIGestureRecognizer
要运用UIGestureRecognizer
,您需求以下几个过程:
- 创立一个详细的手势子类实例,例如
UITapGestureRecognizer
。 - 翻开Main.storyboard,拖拽一个
UIView
或其他UI元素到界面上,作为您要添加手势的视图。 - 在Attributes Inspector中,展开”Gesture Recognizers”,点击”+”按钮添加一个
Tap Gesture Recognizer
。 - 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)
文章完毕。