這兩天在寫iPad的東西,剛好看到這個好用的新Class,iPhone
OS3.2以後大概都會有,
官方範例只有兩種,在這裡幫大家簡單整理一下用法
在3.2以前,我們要拿到UITouch跟使用者互動,大部分都是透過UIResponder的四種methods
- - (void)touch
esBegan:(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
有些人會把UITouch重新wrap丟到自己的queue裡面去處理,
不然就是直接在這幾個function裡直接判斷,其實都不會差太多,簡單的說...就是麻煩 @@
3.2以後,透過UIGestureRecognizer及其他繼承它的UIxxxGestureRecognizer,
偵測使用者輸入就變的簡單許多
廢話說得差不多了....正文開始 ^^
UIxxxGestureRecognizer目前有6種之多(以前自己寫有多可憐
)
- UILongPressGestureRecognizer
- UIPanGestureRecognizer
- UIPinchGestureRecognizer
- UIRotationGestureRecognizer
- UISwipeGestureRecognizer
- UITapGestureRecognizer
照名字看大概就知道這是做什麼用的,所以我就不解釋啦,直接看用法.....
以UIPanGestureRecognizer為例,這是處理使用者用一隻手指(或多隻)在螢幕上滑來滑去的動作,
要偵測這個動作,只要加下面這段code進view
DidLoad或任何你需要的地方...
- UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
- [self.view addGestureRecognizer:panRecognizer];
- panRecognizer.maximumNumberOfTouches = 1;
- panRecognizer.delegate = self;
- [panRecognizer release];
第一個很簡單,就是確定要給這個recognizer handle的event,就會去call這個class底下的handlePanFrom:
然後把recognizer加進UIView裡(addGestureRecognizer),
因為同時間我只想知道一隻手指的動作,所以我用maximumNumberOfTouches=1來限制,
當然,你可以改變maximumNumberOfTouches跟minimumNumberOfTouches的值來當成filter,接著把
delegate設定成自己(記得header要加上UIGestureRecognizerDelegate),不過這樣還沒有結束...
我們要補上這個delegate method
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
裡面可以先filter event,決定要不要丟給一開始assign給panRecognizer的selector function
譬如我只想要看某個subview的事件
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
- UIView *aview = [self.view viewWithTag:1000];
- if (touch.view != aview) {
- return NO; // 不理這個event
- }
- return YES;
- }
接下來就是
- - (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {
- //拿到手指目前的位置
- CGPoint location = [recognizer locationInView:self.view];
- UIView *aview = [self.view viewWithTag:1000];
- // 如果UIGestureRecognizerStateEnded的話...你是拿不到location的
- // 不判斷的話,底下改frame會讓這個subview消失,因為origin的x和y就不見了!!!
- if(recognizer.state != UIGestureRecognizerStateEnded)
- {
- aview.frame = CGRectMake(location.x, location.y, aview.frame.size.width, aview.frame.size.height);
- }
- }
不同的UIGestureRecognizer subclass都會有不同特點,譬如說Pinch的scale,velocity和Swipe的direction,
直接簡化了處理UITouch的步驟,大家只要知道這些特點,處理使用者輸入就會得心應手啦~
遇到靈異事件...記得先看看有沒有判斷UIGestureRecognizer的state喔
from: http://dev.iphonetw.net/redirect.php?tid=1938&goto=lastpost
本文介绍在iOS 3.2之后如何利用UIGestureRecognizer简化触控手势处理,包括各种子类如UILongPressGestureRecognizer、UIPanGestureRecognizer等的使用方法,并通过实例展示如何实现滑动手势。

1041

被折叠的 条评论
为什么被折叠?



