Event Handling Guide for iOS

手势识别状态机

屏幕快照 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手势冲突,可以设置
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变成失败状态

Preventing Gesture Recognizers from Analyzing Touches

protocol to stop

  • gestureRecognizer:shouldReceiveTouch:
  • gestureRecognizerShouldBegin:

Permitting Simultaneous Gesture Recognition

两个手势同时起作用

  • gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

Interacting with Other User Interface Controls

对于重叠的系统UIControl子类控件,如一个button在一个tap recognizer的上方重叠一起,用户按button的时候只会响应button,不会响应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发生


path_of_touches_2x.png

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

试验,测试UIView的响应链方法和gesture的方法顺序

  1. tap


    点击就放
按住后移动然后在view内松手
按住后移动然后在view外松手

2. panGesture


拖动

一开始是调用UIView的事件,后面被识别为pangesture后只执行手势的回调方法

gesture.delaysTouchesBegan = true;

开启gesture.delaysTouchesBegan = true;后,UIView方法完全不执行,但单点击一下松手后如下图
单点一下松手,是松手后才打印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范围内则返回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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容