iOS 事件響應(yīng)的應(yīng)用

接上文iOS 事件傳遞和事件響應(yīng)鏈

1磷账、先來說一下概念性的東西

Hit-Test 是什么
Hit-Test 是一個決定一個點(比如一個觸摸點)是否落在一個給定的物理對象上(比如繪制在屏幕上的UIView)的一個過程。

Hit-Test執(zhí)行時機
Hit-Test是在每次手指觸摸時執(zhí)行的跟磨。并且是在任何視圖或者手勢收到UIEvent(代表觸摸屬于的事件)之前杆怕。

Hit-Test 的實現(xiàn)
實現(xiàn):Hit-Test采用深度優(yōu)先的反序訪問迭代算法(先訪問根節(jié)點然后從高到低訪(從離用戶近的視圖或者說是后添加的視圖為低節(jié)點)族购。這種遍歷方法可以減少遍歷迭代的次數(shù)壳贪。

結(jié)束條件:一旦找到最深的包含觸摸點的后裔視圖就停止遍歷(注意,是最深的)寝杖。

2违施、覆蓋hitTest:withEvent:的一些用途

1. 增加視圖的觸摸區(qū)域

按鈕太小,優(yōu)雅的自定義UIButton瑟幕,覆蓋hitTest:withEvent:方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
        return nil;
    }
    CGRect touchRect = CGRectInset(self.bounds, -10, -10);
    if (CGRectContainsPoint(touchRect, point)) {
        for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
            CGPoint convertedPoint = [subview convertPoint:point fromView:self];
            UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
            if (hitTestView) {
                return hitTestView;
            }
        }
        return self;
    }
    return nil;
}
2. 傳遞觸摸事件給父視圖

有的時候?qū)τ谝粋€視圖忽略觸摸事件并傳遞給下面的視圖是很重要的磕蒲。例如,假設(shè)一個透明的視圖覆蓋在應(yīng)用內(nèi)所有視圖的最上面只盹。覆蓋層有子視圖應(yīng)該相應(yīng)觸摸事件的一些控件和按鈕辣往。但是觸摸覆蓋層的其他區(qū)域應(yīng)該傳遞給覆蓋層下面的視圖。為了完成這個行為殖卑,覆蓋層需要覆蓋hitTest:withEvent:方法來返回包含觸摸點的子視圖中的一個站削,然后其他情況返回nil,包括覆蓋層包含觸摸點的情況:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitTestView = [super hitTest:point withEvent:event];
    if (hitTestView == self) {
        hitTestView = nil;
    }
    return hitTestView;
}

3. 傳遞觸摸事件給子視圖

一個圖片瀏覽器孵稽,在方框內(nèi)滑動许起,可以翻動圖片,但是在方框之外是無法響應(yīng)的菩鲜,因為手指落點不在圖片瀏覽器的bounces里面园细,那么如何讓手指落在上圖位置時,也可以滾動圖片呢睦袖?方法是在圖片瀏覽器的父視圖中珊肃,重載hitTest:withEvent:方法荣刑,當(dāng)觸摸到圖片瀏覽器自視圖之外的視圖時馅笙,返回圖片瀏覽器即可:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitTestView = [super hitTest:point withEvent:event];
    if (hitTestView) {
        hitTestView = self.scrollView;
    }
    return hitTestView;
}

4. 響應(yīng)子view超出了父view的bounds事件

比如自定義Tabbar中間的大按鈕,點擊超出Tabbar bounds的區(qū)域也需要響應(yīng)厉亏,此時重載父view的hitTest: withEvent:方法董习,去掉點擊必須在父view內(nèi)的判斷,然后子view就能成為 hit-test view用于響應(yīng)事件:

最后這個案例引用的0o凍僵的企鵝o0 的UITabBar 自定義中間大按鈕

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爱只,一起剝皮案震驚了整個濱河市皿淋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恬试,老刑警劉巖窝趣,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異训柴,居然都是意外死亡哑舒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門幻馁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洗鸵,“玉大人越锈,你說我怎么就攤上這事”毂酰” “怎么了甘凭?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長火邓。 經(jīng)常有香客問我丹弱,道長,這世上最難降的妖魔是什么铲咨? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任蹈矮,我火速辦了婚禮,結(jié)果婚禮上鸣驱,老公的妹妹穿的比我還像新娘泛鸟。我一直安慰自己,他們只是感情好踊东,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布北滥。 她就那樣靜靜地躺著,像睡著了一般闸翅。 火紅的嫁衣襯著肌膚如雪再芋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天坚冀,我揣著相機與錄音济赎,去河邊找鬼。 笑死记某,一個胖子當(dāng)著我的面吹牛司训,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播液南,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼壳猜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滑凉?” 一聲冷哼從身側(cè)響起统扳,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畅姊,沒想到半個月后咒钟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡若未,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年朱嘴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨瘩。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡腕够,死狀恐怖级乍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帚湘,我是刑警寧澤玫荣,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站大诸,受9級特大地震影響捅厂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜资柔,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一焙贷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贿堰,春花似錦辙芍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵搁,卻和暖如春吃衅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腾誉。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工徘层, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人利职。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓趣效,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眼耀。 傳聞我的和親對象是個殘疾皇子英支,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355