Event Handling Guide for iOS

手勢識別狀態(tài)機

屏幕快照 2016-11-07 下午5.49.31.png

Interacting with Other Gesture Recognizers

When a view has multiple gesture recognizers attached to it, you may want to alter how the competing gesture recognizers receive and analyze touch events. By default, there is no set order for which gesture recognizers receive a touch first, and for this reason touches can be passed to gesture recognizers in a different order each time. You can override this default behavior to:

  • Specify that one gesture recognizer should analyze a touch before another gesture recognizer.
  • Allow two gesture recognizers to operate simultaneously.
    Prevent a gesture recognizer from analyzing a touch.
  • Use the UIGestureRecognizer class methods, delegate methods, and methods overridden by subclasses to effect these behaviors.

手勢沖突,同一個touch被手勢識別的順序可能不一樣

Declaring a Specific Order for Two Gesture Recognizers

例子:拖動手勢與swipe手勢沖突,可以設(shè)置
If the swipe gesture recognizer determines that a touch is a swipe, the pan gesture recognizer never needs to analyze the touch. If the swipe gesture recognizer determines that the touch is not a swipe, it moves to the Failed state and the pan gesture recognizer should begin analyzing the touch event.

to set up a permanent relationship between the two objects at creation time,同view層級的

  • requireGestureRecognizerToFail:
    下面兩個代理方法,that you can set up failure requirements between recognizers in different view hierarchies.跨view層級,用途還看不太懂。。。
  • gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
  • gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:

如果想單擊和雙擊共存,單擊會有一個延遲直到雙擊的recognize變成失敗狀態(tài)

Preventing Gesture Recognizers from Analyzing Touches

protocol to stop

  • gestureRecognizer:shouldReceiveTouch:
  • gestureRecognizerShouldBegin:

Permitting Simultaneous Gesture Recognition

兩個手勢同時起作用

  • gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

Interacting with Other User Interface Controls

對于重疊的系統(tǒng)UIControl子類控件,如一個button在一個tap recognizer的上方重疊一起,用戶按button的時候只會響應(yīng)button,不會響應(yīng)recognizer

Gesture Recognizers Interpret Raw Touch Events

An App Receives Touches in the Touch-Handling Methods

  • touchesBegan:withEvent: method when one or more fingers touch down on the screen.
  • touchesMoved:withEvent: method when one or more fingers move.
  • touchesEnded:withEvent: method when one or more fingers lift up from the screen.
  • touchesCancelled:withEvent: method when the touch sequence is canceled by a system event, such as an incoming phone call.

Regulating the Delivery of Touches to Views

A window delays the delivery of touch objects to the view so that the gesture recognizer can analyze the touch first. During the delay, if the gesture recognizer recognizes a touch gesture, then the window never(回頭再看看這里) delivers the touch object to the view, and also cancels any touch objects it previously sent to the view that were part of that recognized sequence.

touch發(fā)生


path_of_touches_2x.png

=>touchObject=>UIApplication=>UIWindow=>send Touch To gesture recognizers =>view

試驗,測試UIView的響應(yīng)鏈方法和gesture的方法順序

  1. tap


    點擊就放
按住后移動然后在view內(nèi)松手
按住后移動然后在view外松手

2. panGesture


拖動

一開始是調(diào)用UIView的事件,后面被識別為pangesture后只執(zhí)行手勢的回調(diào)方法

gesture.delaysTouchesBegan = true;

開啟gesture.delaysTouchesBegan = true;后,UIView方法完全不執(zhí)行,但單點擊一下松手后如下圖
單點一下松手,是松手后才打印begin的!!不是松手前!!!

Affecting the Delivery of Touches to Views

這里看的迷迷糊糊的

涉及屬性

  • delaysTouchesBegan
  • delaysTouchesEnded
  • ignoreTouch:forEvent:

Creating a Custom Gesture Recognizer



Event Delivery: The Responder Chain

When a user-generated event occurs, UIKit creates an event object containing the information needed to process the event. Then it places the event object in the active app’s event queue. For touch events, that object is a set of touches packaged in a UIEvent object.

  • Touch events. For touch events, the window object first tries to deliver the event to the view where the touch occurred. That view is known as the hit-test view. The process of finding the hit-test view is called hit-testing

  • Motion and remote control events. With these events, the window object sends the shaking-motion or remote control event to the first responder for handling.

Hit-Testing Returns the View Where a Touch Occurred

  • hitTest:withEvent:
  • pointInside:withEvent:(傳入的point與view的bounds比較,如果在bounds范圍內(nèi)則返回true,如果返回false,上面的hitTest:withEvent:返回nil)

The hitTest:withEvent: method returns the hit test view for a given CGPoint and UIEvent. The hitTest:withEvent: method begins by calling the pointInside:withEvent: method on itself. If the point passed into hitTest:withEvent: is inside the bounds of the view, pointInside:withEvent: returns YES. Then, the method recursively calls hitTest:withEvent: on every subview that returns YES.

If the point passed into hitTest:withEvent: is not inside the bounds of the view, the first call to the pointInside:withEvent: method returns NO, the point is ignored, and hitTest:withEvent: returns nil. If a subview returns NO, that whole branch of the view hierarchy is ignored, because if the touch did not occur in that subview, it also did not occur in any of that subview’s subviews. This means that any point in a subview that is outside of its superview can’t receive touch events because the touch point has to be within the bounds of the superview and the subview. This can occur if the subview’s clipsToBounds property is set to NO.

The Responder Chain Is Made Up of Responder Objects

The UIResponder class is the base class for all responder objects,如 UIApplication, UIViewController, and UIView

An object becomes the first responder by doing two things:

  • Overriding the canBecomeFirstResponder method to return YES.
  • Receiving a becomeFirstResponder message. If necessary, an object can send itself this message.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容