iPhone中处理触摸屏的操作,在3.2之前是主要使用的如下4种方式:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
但是这种方式比较麻烦,目前有了比较简便的方式,就是使用UIGestureRecognizer。
UIGestureRecognizer
是一个抽象类,我们主要是使用它的子类:
UITapGestureRecognizer
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UISwipeGestureRecognizer
UIPanGestureRecognizer
UILongPressGestureRecognizer
从名字上我们就能知道,
Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。举个例子,可以在viewDidLoad函数里面添加:
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[self.view addGestureRecognizer:panRecognizer];
panRecognizer.maximumNumberOfTouches = 1;
panRecognizer.delegate = self;
[panRecognizer release];
其它手势方法类似。主要就是设置delegate和在需要的view上使用addGestureRecognizer。当然在要记得在作为delegate的view的头文件加上<UIGestureRecognizerDelegate>。
不过有些手势是关联的,怎么办呢?例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。比如单击和双击,如果它识别出一种手势,其后的手势将不被识别,也就是说单击和双击并存时,它只能发送出单击的消息,这个时候就需要先判断是否时双击,在双击失效的情况下作为单击。
requireGestureRecognizerToFail,他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。
-
(
void
)
viewDidLoad
{
// 单击的 Recognizer
UITapGestureRecognizer
*
singleRecognizer
;
singleRecognizer
=
[[
UITapGestureRecognizer
alloc
]
initWithTarget:
self
action:
@selector
(
handleSingleTapFrom
)];
singleTapRecognizer
.
numberOfTapsRequired
=
1
;
// 单击
[
self
.
view
addGestureRecognizer:
singleRecognizer
];
// 双击的 Recognizer
UITapGestureRecognizer
*
double
;
doubleRecognizer
=
[[
UITapGestureRecognizer
alloc
]
initWithTarget:
self
action:
@selector
(
handleDoubleTapFrom
)];
doubleTapRecognizer
.
numberOfTapsRequired
=
2
;
// 双击
[
self
.
view
addGestureRecognizer:
doubleRecognizer
];
// 关键在这一行,如果双击确定偵測失败才會触发单击
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[
singleRecognizer
release
];
[
doubleRecognizer
release
];
}
http://blog.csdn.net/pjk1129/article/details/6824810