Swift - 各种手势检测大全(UIGestureRecognizer及其子类)
UIGestureRecognizer 有许多子类,用于监听一些常见的手势事件,这些子类主要有:
(2)UIScreenEdgePanGestureRecognizer 没有 direction 属性,增加了个 edges 属性。表示要响应哪个边缘的划动操作。可以是从左边缘向右滑动,或右边缘向左、上边缘向下、下边缘向上、或响应全部边缘滑动。
(2)通过 numberOfTapsRequired 属性设置点击次数,单击设置为 1,双击设置为 2
(3)如果一个控件既监听了单击事件也监听了双击事件,默认当双击事件触发的时候也同时会触发单击事件。如果想双击时不触发单击,需要通过 require(toFail:) 进行设置
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_546.html
1,UISwipeGestureRecognizer:滑动(快速移动)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() let swipe = UISwipeGestureRecognizer (target: self , action:#selector(swipe(_:))) swipe.direction = .up self .view.addGestureRecognizer(swipe) } func swipe(_ recognizer: UISwipeGestureRecognizer ){ print ( "swipe ok" ) let point=recognizer.location( in : self .view) //这个点是滑动的起点 print (point.x) print (point.y) } } |
注意1:如果 UISwipeGestureRecognizer 在不指定方向的时候,默认向右滑动才会触发事件。如果要指定方向,需要设置 direction 属性
1
2
|
//表示监听滑动的方向为向上 swipe.direction = .up |
注意2:有网友问如果各个方向都要响应怎么办,只要多定义几个 UISwipeGestureRecognizer 就可以了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() let swipeUp = UISwipeGestureRecognizer (target: self , action:#selector(swipe(_:))) swipeUp.direction = .up self .view.addGestureRecognizer(swipeUp) let swipeDown = UISwipeGestureRecognizer (target: self , action:#selector(swipe(_:))) swipeDown.direction = .down self .view.addGestureRecognizer(swipeDown) } func swipe(_ recognizer: UISwipeGestureRecognizer ){ if recognizer.direction == .up{ print ( "向上滑动" ) } else if recognizer.direction == .down{ print ( "向下滑动" ) } let point=recognizer.location( in : self .view) //这个点是滑动的起点 print (point.x) print (point.y) } } |
2,UIScreenEdgePanGestureRecognizer:边缘滑动
(1)这个是 UISwipeGestureRecognizer 的子类,与后者不同的时。UIScreenEdgePanGestureRecognizer 只触发从边缘开始的划动操作,比如从左侧边缘开始向右滑动。(2)UIScreenEdgePanGestureRecognizer 没有 direction 属性,增加了个 edges 属性。表示要响应哪个边缘的划动操作。可以是从左边缘向右滑动,或右边缘向左、上边缘向下、下边缘向上、或响应全部边缘滑动。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() let swipe = UIScreenEdgePanGestureRecognizer (target: self , action:#selector(swipe(_:))) swipe.edges = UIRectEdge .left //从左边缘开始滑动 self .view.addGestureRecognizer(swipe) } func swipe(_ recognizer: UIScreenEdgePanGestureRecognizer ){ print ( "left edgeswipe ok" ) let point=recognizer.location( in : self .view) //这个点是滑动的起点 print (point.x) print (point.y) } } |
3,UITapGestureRecognizer:轻点手势(点击)
(1)可以通过 numberOfTouchesRequired 属性设置触摸点数,比如设置 2 表示必须两个手指触摸时才会触发(2)通过 numberOfTapsRequired 属性设置点击次数,单击设置为 1,双击设置为 2
(3)如果一个控件既监听了单击事件也监听了双击事件,默认当双击事件触发的时候也同时会触发单击事件。如果想双击时不触发单击,需要通过 require(toFail:) 进行设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //单击监听 let tapSingle= UITapGestureRecognizer (target: self ,action:#selector(tapSingleDid)) tapSingle.numberOfTapsRequired = 1 tapSingle.numberOfTouchesRequired = 1 //双击监听 let tapDouble= UITapGestureRecognizer (target: self ,action:#selector(tapDoubleDid(_:))) tapDouble.numberOfTapsRequired = 2 tapDouble.numberOfTouchesRequired = 1 //声明点击事件需要双击事件检测失败后才会执行 tapSingle.require(toFail: tapDouble) self .view.addGestureRecognizer(tapSingle) self .view.addGestureRecognizer(tapDouble) } func tapSingleDid(){ print ( "单击了" ) } func tapDoubleDid(_ sender: UITapGestureRecognizer ){ if sender.view == self .view{ print ( "双击了" ) } } } |
4,UIPinchGestureRecognizer:捏合手势(两个手指进行放大缩小)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //设置监听方法为pinchDid方法 let pinch = UIPinchGestureRecognizer (target: self ,action:#selector(pinchDid(_:))) self .view.addGestureRecognizer(pinch) } func pinchDid(_ recognizer: UIPinchGestureRecognizer ) { //在监听方法中可以实时获得捏合的比例 print (recognizer.scale); } } |
5,UIRotationGestureRecognizer:旋转手势(两个手指进行旋转)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() let rotation = UIRotationGestureRecognizer (target: self , action:#selector(rotationDid(_:))) self .view.addGestureRecognizer(rotation) } func rotationDid(_ recognizer: UIRotationGestureRecognizer ){ //旋转的弧度转换为角度 print (recognizer.rotation*(180/ CGFloat ( M_PI ))) } } |
6,UIPanGestureRecognizer:拖动手势
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import UIKit class ViewController : UIViewController { var rect: UIView ! override func viewDidLoad() { super .viewDidLoad() rect = UIView (frame: CGRect (x:0, y:0, width:100, height:100)) rect.center = self .view.center rect.backgroundColor = UIColor .orange self .view.addSubview(rect) let pan = UIPanGestureRecognizer (target: self ,action:#selector(panDid(_:))) pan.maximumNumberOfTouches = 1 rect.addGestureRecognizer(pan) } func panDid(_ recognizer: UISwipeGestureRecognizer ){ let point=recognizer.location( in : self .view) //设置矩形的位置 rect.center=point } } |
通过 recognizer.view 我们可以直接得到触发事件的 view 对象,下面样例创建两个方块,但它们使用同一个拖动响应方法。
(注意:由于一个 GestureRecognizer 只能对应一个 view,所以每个 view 还是要分别使用各自的 GestureRecognizer)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //定义两个方块 let rect1 = UIView (frame: CGRect (x:0, y:0, width:100, height:100)) rect1.center = self .view.center rect1.backgroundColor = UIColor .orange self .view.addSubview(rect1) let rect2 = UIView (frame: CGRect (x:0, y:0, width:100, height:100)) //rect2.center = self.view.center rect2.backgroundColor = UIColor .yellow self .view.addSubview(rect2) //由于一个GestureRecognizer只能对应一个view,这里定义两个GestureRecognizer let pan1 = UIPanGestureRecognizer (target: self ,action:#selector(panDid(_:))) pan1.maximumNumberOfTouches = 1 rect1.addGestureRecognizer(pan1) let pan2 = UIPanGestureRecognizer (target: self ,action:#selector(panDid(_:))) pan2.maximumNumberOfTouches = 1 rect2.addGestureRecognizer(pan2) } //两个方块都使用同一拖拽响应方法 func panDid(_ recognizer: UIPanGestureRecognizer ){ let point=recognizer.location( in : self .view) //设置矩形的位置 recognizer.view?.center = point } } |
7,UILongPressGestureRecognizer:长按
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //长按监听 let longPress = UILongPressGestureRecognizer (target: self , action:#selector(longPressDid(_:))) self .view.addGestureRecognizer(longPress) } func longPressDid(_ sender: UILongPressGestureRecognizer ){ if sender.state == .began { print ( "长按响应开始" ) } else { print ( "长按响应结束" ) } } } |
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_546.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2016-07-14 android 判断应用程序是否已安装