如何用UIGestureRecognizer去偵測使用者輸入

本文介绍在iOS 3.2之后如何利用UIGestureRecognizer简化触控手势处理,包括各种子类如UILongPressGestureRecognizer、UIPanGestureRecognizer等的使用方法,并通过实例展示如何实现滑动手势。

這兩天在寫iPad的東西,剛好看到這個好用的新Class,iPhone OS3.2以後大概都會有,
官方範例只有兩種,在這裡幫大家簡單整理一下用法

在3.2以前,我們要拿到UITouch跟使用者互動,大部分都是透過UIResponder的四種methods

  1. - (void)touch esBegan:(NSSet *)touches withEvent:(UIEvent *)event
  2. - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
  3. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  4. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
複製代碼

有些人會把UITouch重新wrap丟到自己的queue裡面去處理,
不然就是直接在這幾個function裡直接判斷,其實都不會差太多,簡單的說...就是麻煩 @@

3.2以後,透過UIGestureRecognizer及其他繼承它的UIxxxGestureRecognizer,
偵測使用者輸入就變的簡單許多
廢話說得差不多了....正文開始 ^^

UIxxxGestureRecognizer目前有6種之多(以前自己寫有多可憐

)

  1. UILongPressGestureRecognizer
  2. UIPanGestureRecognizer
  3. UIPinchGestureRecognizer
  4. UIRotationGestureRecognizer
  5. UISwipeGestureRecognizer
  6. UITapGestureRecognizer
複製代碼

照名字看大概就知道這是做什麼用的,所以我就不解釋啦,直接看用法.....

以UIPanGestureRecognizer為例,這是處理使用者用一隻手指(或多隻)在螢幕上滑來滑去的動作,
要偵測這個動作,只要加下面這段code進view DidLoad或任何你需要的地方...

  1. UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
  2. [self.view addGestureRecognizer:panRecognizer];
  3. panRecognizer.maximumNumberOfTouches = 1;
  4. panRecognizer.delegate = self;
  5. [panRecognizer release];
複製代碼

第一個很簡單,就是確定要給這個recognizer handle的event,就會去call這個class底下的handlePanFrom:
然後把recognizer加進UIView裡(addGestureRecognizer),
因為同時間我只想知道一隻手指的動作,所以我用maximumNumberOfTouches=1來限制,
當然,你可以改變maximumNumberOfTouches跟minimumNumberOfTouches的值來當成filter,接著把 delegate設定成自己(記得header要加上UIGestureRecognizerDelegate),不過這樣還沒有結束...

我們要補上這個delegate method

  1. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
複製代碼

裡面可以先filter event,決定要不要丟給一開始assign給panRecognizer的selector function
譬如我只想要看某個subview的事件

  1. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
  2.    UIView *aview = [self.view viewWithTag:1000];
  3.    if (touch.view != aview) {
  4.      return NO; // 不理這個event
  5.    }
  6.    return YES;
  7. }
複製代碼

接下來就是

  1. - (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {       
  2.         //拿到手指目前的位置
  3.         CGPoint location = [recognizer locationInView:self.view];
  4.         UIView *aview = [self.view viewWithTag:1000];

  5.         // 如果UIGestureRecognizerStateEnded的話...你是拿不到location的
  6.         // 不判斷的話,底下改frame會讓這個subview消失,因為origin的x和y就不見了!!!
  7.         if(recognizer.state != UIGestureRecognizerStateEnded)
  8.         {
  9.                 aview.frame = CGRectMake(location.x, location.y, aview.frame.size.width, aview.frame.size.height);
  10.         }
  11. }
複製代碼

不同的UIGestureRecognizer subclass都會有不同特點,譬如說Pinch的scale,velocity和Swipe的direction,
直接簡化了處理UITouch的步驟,大家只要知道這些特點,處理使用者輸入就會得心應手啦~
遇到靈異事件...記得先看看有沒有判斷UIGestureRecognizer的state喔


from: http://dev.iphonetw.net/redirect.php?tid=1938&goto=lastpost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值