在開發 iOS 程式的時候,有很多機會會用到手勢偵測(gesture recognizer),或許有一個場景是這樣的:

  • 你有個 superview,裡頭有 subview,裡頭還有 sub-subview,還有 sub-sub-subview
  • 每個 view 都放了一或多個手勢偵測

我們會直覺的認為:既然 view 是一層層疊起來,那應該是最上層的手勢偵測失敗,才會傳遞到下一層手勢偵測,若是又失敗就繼續往下傳遞。

這在之前的 iOS 似乎都運作的好好的,但不知道為何,到了 iOS 7 竟然出錯了 - 有時候上層的手勢沒有被辨識到,反而是下層的手勢先被執行了!難道不是最上層的手勢先被執行嗎?我的程式碼哪裡寫錯了嗎?

這一定是 iOS 7 的 bug 啦!

很不幸的,當你認真翻閱蘋果文件時,你會發現它有說:

手勢辨識的順序是不保證的,並非越上層的手勢就會越早被辨識

咦?那為什麼之前都運作的好好的?啊災~應該是 iOS 7 又改了什麼機制吧。那要怎麼解決呢?還好 iOS 7 的 <UIGestureRecognizerDelegate> 引進了以下兩個新方法:

1

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 這個方法的意思是說:是否要 gestureRecognizer 被判定偵測失敗了,才可以偵測 otherGestureRecognizer

2

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 這個方法的意思是說:是否要 otherGestureRecognizer 被判定失敗了,才可以偵測 gestureRecognizer

兩個方法長得很像,很容易搞混。使用時機不太一樣,看哪個比較適合你的使用情境就挑哪個來用。


參考資料:
Should superview's gesture cancel subview's gesture in iOS 7?
Problems with gesture recognizer in iOS 7

Nelson 發表在 痞客邦 PIXNET 留言(0) 人氣()