首先要知道的是
1.這3個屬性是作用于GestureRecognizers(手勢識別)與觸摸事件之間聯(lián)系的屬性镊绪。實際應(yīng)用中好像很少會把它們放到一起,大多都只是運用手勢識別陪捷,所以這3個屬性應(yīng)該很少會用到缩滨。
2.對于觸摸事件,window只會有一個控件來接收touch杀饵。這個控件是首先接觸到touch的并且重寫了觸摸事件方法(一個即可)的控件
3.手勢識別和觸摸事件是兩個獨立的事,只是可以通過這3個屬性互相影響谬擦,不要混淆切距。
4手勢是view外部來添加? ,? touch是view內(nèi)部處理,兩個是分開,且手勢優(yōu)先級比touch高
UIView?*view?=?[gestureRecognizer?view];//?這個view是手勢所屬的view,也就是增加手勢的那個view
cancelsTouchesInView/delaysTouchesBegan/delaysTouchesEnded
(1)在默認(rèn)情況下(即這3個屬性都處于默認(rèn)值的情況下)(這些屬性是 手勢對它自己的view!!!)
如果觸摸window惨远,首先由window上最先符合條件的控件(該控件記為hit-test
view)接收到該touch并觸發(fā)觸摸事件touchesBegan谜悟。同時如果某個控件的手勢識別器接收到了該touch,就會進行識別北秽。手勢識別成功之后發(fā)送觸摸事件touchesCancelled給hit-testview葡幸,hit-test
view不再響應(yīng)touch。(即打斷 往上傳遞的響應(yīng)鏈條)
(2)cancelsTouchesInView:(默認(rèn)yes)
默認(rèn)為YES,這種情況下當(dāng)手勢識別器識別到touch之后贺氓,會發(fā)送touchesCancelled給hit-testview以取消hit-test view對touch的響應(yīng)蔚叨,這個時候只有手勢識別器響應(yīng)touch。
當(dāng)設(shè)置成NO時,手勢識別器識別到touch之后不會發(fā)送touchesCancelled給hit-test蔑水,這個時候手勢識別器和hit-test view均響應(yīng)touch邢锯。
(3)delaysTouchesBegan:(默認(rèn)no)
默認(rèn)是NO,這種情況下當(dāng)發(fā)生一個touch時搀别,手勢識別器先捕捉到到touch丹擎,然后發(fā)給hit-testview,兩者各自做出響應(yīng)领曼。
如果設(shè)置為YES鸥鹉,手勢識別器在識別的過程中(注意是識別過程)蛮穿,不會將touch發(fā)給hit-test
view庶骄,即hit-testview不會有任何觸摸事件。!!只有在識別失敗之后才會將touch發(fā)給hit-testview践磅,這種情況下hit-test
view的響應(yīng)會延遲約0.15ms单刁。
(4)delaysTouchesEnded:(默認(rèn)yes)
默認(rèn)為YES。這種情況下發(fā)生一個touch時府适,在手勢識別成功后,發(fā)送給touchesCancelled消息給hit-testview羔飞,手勢識別失敗時,會延遲大概0.15ms,期間沒有接收到別的touch才會發(fā)送touchesEnded檐春。如果設(shè)置為NO逻淌,則不會延遲,即會立即發(fā)送touchesEnded以結(jié)束當(dāng)前觸摸疟暖。
gestureRecognizer.state? 手勢的6種狀態(tài)
1.UIGestureRecognizerStateBegan
2.UIGestureRecognizerStateChanged
3.UIGestureRecognizerStateEnded
4.UIGestureRecognizerStateCancelled
5.UIGestureRecognizerStateFailed
6.UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
// 是否開啟手勢
-?(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer?*)gestureRecognizer
同時執(zhí)行手勢
// 詢問delegate卡儒,兩個手勢是否同時接收消息,返回YES同事接收俐巴。返回NO骨望,不同是接收(如果另外一個手勢返回YES,則并不能保證不同時接收消息)the default implementation returns NO欣舵。
//?這個函數(shù)一般在一個手勢接收者要阻止另外一個手勢接收自己的消息的時候調(diào)用
-?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer?*)otherGestureRecognizer
// 詢問delegate是否允許手勢接收者接收一個touch對象
//?返回YES擎鸠,則允許對這個touch對象審核,NO缘圈,則不允許劣光。
//?這個方法在touchesBegan:withEvent:之前調(diào)用,為一個新的touch對象進行調(diào)用
-?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldReceiveTouch:(UITouch?*)touch
手勢共存 與 排斥(以下是手勢對手勢!!)
1:[tapGesture? requireGestureRecognizerToFail:swipeGesture]
swipe判斷失敗后? 才判斷tap
2:(代理方法)-
(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer
這里返回YES糟把,代表跟別的手勢共存绢涡;如果返回NO,不一定代表不共存(可能另一個手勢返回yes就可以共存,只要兩個手勢任一返回yes就可以)
3:-
(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer
另外一個手勢識別fail的時候糊饱,才會識別自己
4-
(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer
我被另外一個手勢變成Fail
(6)button 是用這個方法發(fā)送時間(補充)
- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event