UIGestureRecognizer 的共存

UIGestureRecognizer 的共存,第1张

概述在 iPhone 或 iPad 的開發中,除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外,也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在於有現成的手勢,開發者不用自己計算手指移動的軌跡。UIGestureRecognizer的衍生類別有以下數 在 iPhone 或 iPad 的開發中,除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外,也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在於有現成的手勢,開發者不用自己計算手指移動的軌跡。UIGestureRecognizer的衍生類別有以下數種:

UITapGestureRecognizer UIPinchGestureRecognizer UIRotationGestureRecognizer UISwipeGestureRecognizer UIPanGestureRecognizer UILongPressGestureRecognizer
從命名上不難了解這些類別所對應代表的手勢,分別是 Tap(點一下)、Pinch(二指往內或往外撥動)、Rotation(旋轉)、Swipe(滑動,快速移動)、Pan (拖移,慢速移動)以及 LongPress(長按)。這些手勢類別在使用上也很簡單,只要在使用前宣告並掛到對應的視圖(UIVIEw)元件上即可。

                      // 宣告一個 recognizer,並加到需要偵測該手勢的 UIVIEw 元件上                                -             (            voID            )            vIEwDIDLoad             {                                                UISwipeGestureRecognizer            *             recognizer            ;                                                // handleSwipeFrom 是偵測到手勢後,所要呼叫的方法                                                recognizer             =             [[            UISwipeGestureRecognizer             alloc            ]             initWithTarget:            self             action:            @selector            (            handleSwipeFrom            )];                                                // 不同的 Recognizer 有不同的實體變數                                                // 例如 SwipeGesture 可以指定方向                                                // 而 TapGesture 則可以指定次數                                                recognizer            .            direction             =             UISwipeGestureRecognizerDirectionUp                                                [            self            .            vIEw             addGestureRecognizer:            recognizer            ];                                                [            recognizer             release            ];                                             }                                                                              voID            )            handleSwipeFrom:            (            UISwipeGestureRecognizer            *            )            recognizer             {                                                // 觸發手勢事件後,在這裡作些事情                                                                    // 底下是刪除手勢的方式                                                [            self            .            vIEw             removeGestureRecognizer:            recognizer            ];                                             }          
view raw uigesturerecognizer.m This Gist brought to you by  GitHub.
問題來了。有些手勢其實是互相關連的,例如 Tap 與 LongPress、Swipe 與 Pan,或是 Tap 一次與 Tap 兩次。當一個 UIVIEw 同時掛上兩個相關連的手勢時,到底我這一下手指頭按的要算是 Tap 還是 LongPress?如果照預設作法來看,只要「先滿足條件」的就會跳出並呼叫對應方法,舉例來說,如果同時註冊了 Pan 跟 Swipe,只要手指頭一移動就會觸發 Pan 然後跳出,因而永遠都不會發生 Swipe;單點與雙點的情形也是一樣,永遠都只會觸發單點,不會有雙點。

那麼這問題有解嗎?有的, UIGestureRecognizer 有個方法叫做 requireGestureRecognizerToFail,他可以指定某一個 recognizer,即便自己已經滿足條件了,也不會立刻觸發,會等到該指定的 recognizer 確定失敗之後才觸發。以同時支援單點擊與雙點擊的作法為例,程式碼如下:

vIEwDIDLoad {      // 單擊的 Recognizer      UITapGestureRecognizer * singleRecognizer ;      singleRecognizer = [[ UITapGestureRecognizer alloc ] initWithTarget: self action: @selector ( handleSingleTapFrom )];      singleTapRecognizer . numberOfTapsrequired = 1 ; // 單擊      [ self . vIEw addGestureRecognizer: singleRecognizer ];           // 雙擊的 Recognizer      UITapGestureRecognizer * double ;      doubleRecognizer @selector ( handleDoubleTapFrom )];      doubleTapRecognizer . numberOfTapsrequired 2 ; // 雙擊      [ self . vIEw addGestureRecognizer: doubleRecognizer ];           // 關鍵在這一行,如果雙擊確定偵測失敗才會觸發單擊      [ singleRecognizer requireGestureRecognizerToFail: doubleRecognizer ];      [ singleRecognizer release ];      [ doubleRecognizer release ]; } view raw uitapgesturerecognizer.m GitHub.
如此一來,在第一下點擊後,如果有迅速點擊第二下,就會觸發  doubleRecognizer;反之要是隔了一小段時間,造成  doubleRecognizer 發生 fail,就會回頭觸發 singleRecognizer 了。 总结

以上是内存溢出为你收集整理的UIGestureRecognizer 的共存全部内容,希望文章能够帮你解决UIGestureRecognizer 的共存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1093654.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存