1.原理底層偽代碼
?2:hitTest 方法的練習(xí)1:
業(yè)務(wù)邏輯:
底部一個按鈕, 按鈕的上面有一個View,遮擋在按鈕的上面.
點擊View時, View接收事件,當(dāng)發(fā)現(xiàn)點擊的點在按鈕的位置時, 讓底部的按鈕處理事件.
實現(xiàn)思路:
實現(xiàn)View的touchBegain方法,先堅聽UIView的點擊.
并去實現(xiàn)UIView的HitTest方法, 在hitTest方法當(dāng)中通過把當(dāng)前點轉(zhuǎn)換成按鈕所在的坐標(biāo)系
?CGPoint btnP = [self convertPoint:point toView:self.btn];
?轉(zhuǎn)換過后查看當(dāng)前點在不在按鈕上,如果在按鈕上,就直接返回按鈕.
?如果有在按鈕上,保持系統(tǒng)默認(rèn)做法.
? ? 實現(xiàn)代碼:
?-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
? ? 判斷當(dāng)前點在不在按鈕上.
? ? 把當(dāng)前點轉(zhuǎn)換成按鈕所在的坐標(biāo)系
? ? CGPoint btnP = [self convertPoint:point toView:self.btn];
? ? if ([self.btn pointInside:btnP withEvent:event]) {
? ? ? ? return self.btn;
? ? }else{
? ? ? return [super hitTest:point withEvent:event];
? ? }
}
注意:在storyBoard中定義了view和按鈕,view自定義可以拖線到自定義的view中点寥,前提是得進行類的關(guān)聯(lián)艾疟,但是button不能拖入,因為button不屬于view的子控件敢辩,解決:可以在view中屬性定義IBOutlet蔽莱,在拖線到storyBoard中的按鈕,這樣就在view中拿到了不屬于view的button
2:hitTest練習(xí)2
業(yè)務(wù)邏輯:
按鈕可以隨著?手指拖動?而拖動.拖動過程當(dāng)中,按鈕當(dāng)中的?子控件也跟著拖動. 讓超過按鈕的?子控件也能夠響應(yīng)事件,?一般情況下,當(dāng)?一個控件超過他的?父控件的時候,是不能 夠接收事件的.
現(xiàn)在要做的事情就讓超過?父控件的按鈕也能夠響應(yīng)事件.
一般情況下,當(dāng)?一個控件超過他的?父控件的時候,是不能 夠接收事件的.原因是:
1:當(dāng)產(chǎn)生觸摸事件后戚长,系統(tǒng)會將觸摸事件發(fā)送到由UIApplication管理的事件隊列中盗冷,UIApplication會將隊列中最前端的事件取出來交給keywindow去處理,主窗口keywindow會1:查看自身能不能接受觸摸事件?
2:觸摸點是不是在自身上?
?3:若是前兩個條件都滿足則其會遍歷自身的子控件同廉,且是從后到前遍歷仪糖,也就是從子控件數(shù)組的最后一個控件開始遍歷柑司,再執(zhí)行前兩個步驟,若是不在乓诽,則遍歷下一個子控件帜羊,若是一直沒找到,則自己就是最合適處理事件的view鸠天,若在,則繼續(xù)重復(fù)前兩個步驟帐姻,直到找到最合適的view稠集。
當(dāng)點擊按鈕的時候window將事件傳遞到白色view,白色view從后往前遍歷子控件饥瓷,先遍歷藍(lán)色的button剥纷,再遍歷點擊對話框,找到適合處理事件的view呢铆。當(dāng)子控件超出父控件的范圍后晦鞋,點擊子控件時不會響應(yīng)事件,原因是:當(dāng)遍歷到父控件點擊對話框時棺克,觸摸點不再其身上悠垛,則其就不會響應(yīng)事件
實現(xiàn)思路:
第一步,先辦到讓按鈕能夠跟隨著?手指移動?而移動. 實現(xiàn)按鈕的touchesMoved?方法,在touchesMoved?方法當(dāng)中,獲得當(dāng)前?手指所在的點.以前上一 個點.一個手指對應(yīng)一個UITouch對象,一個手指取出UITouch娜谊,anyobject确买,若是多根手指則會touch.allobjects獲取所有的UITouch對象,分別計算X軸的偏移量以及Y軸的偏移量. 然后修改當(dāng)前按鈕的transform讓按鈕辦到能夠跟隨著?手指移動?而移動(累加形變).
第二步,
1: 實現(xiàn)按鈕的hitTest?法. 在該方法當(dāng)中去判斷當(dāng)前的點在不在按鈕的?控件上. 如果在按鈕的?控件上.就返回按鈕的子控件,如果不在的話, 就保持系統(tǒng)的默認(rèn)做法.一般在父類中重寫hitTest方法纱皆,修改返回最合適的view
?2:self.chatBtn.btn定義為弱引用湾趾,?self.chatBtn.btn = btn賦值指針地址,弱引用指向該對象派草,[self.chatBtn addSubview:btn];強引用引用著btn使其不被銷毀搀缠,所以可以用weak
?3:事件會由白色view傳遞到其子控件self.chatBtn上,所以在self.chatBtn的類里重寫hitTest方法近迁,修改返回的view