iOS超出容器范圍的子控件點擊事件(地圖點標(biāo))

我們都知道,通過設(shè)置視圖View的clipToBounds=NO屬性能夠允許子View超過父View, 但是超出父View的部分不會響應(yīng)手勢事件。

之所以產(chǎn)生了這篇文章,是因為在實際的開發(fā)過程中,為了配合UI設(shè)計還有一些用戶體驗,我們需要讓子View在超出父控件后,仍然可以響應(yīng)點擊事件。

一個常見的場景是Tab欄,比如:


6CE0EB4C-FB25-4CD0-B43D-8CDEF7F3573C.png

另一個場景就是地圖應(yīng)用的點標(biāo),使用過百度地圖和高度地圖的SDK,我發(fā)現(xiàn)點標(biāo)的選中事件都坐落在圖標(biāo)上,不管將點標(biāo)VIEW的bounds設(shè)置多大都無濟(jì)于事。這就很尷尬了。因為我們有可能還需要在圖標(biāo)的上方或下方加入標(biāo)題文字,而這個文字很可能超出了整個點標(biāo)控件,并且由于用戶習(xí)慣會去點擊文字,因此我們需要讓用戶點擊文字時也觸發(fā)點標(biāo)的選中事件。


32290F43-2C08-4D75-82CC-B66EF23B0585.png

諸如此類應(yīng)用場景中,我們需要重寫View的手勢響應(yīng)方法,以地圖點標(biāo)為例:

// 地圖標(biāo)點視圖  AnnotationView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 如果View不為空,代表觸摸的位置有視圖攔截了這個事件
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        for (UIView *subView in self.subviews) {
            CGPoint myPoint = [subView convertPoint:point fromView:self];
            // 判斷觸摸的位置是否存在自己的子控件,即便這個子控件超出了父視圖的范圍
            if (CGRectContainsPoint(subView.bounds, myPoint)) {
                // 返回一個攔截事件的對象,這個對象可以是self,也可以是具體的子控件
                return self;
            }
        }
    }
    return view;
}

用戶點擊屏幕時,系統(tǒng)會將事件分發(fā)給所有可見視圖的hitTest方法,如果該方法返回的是nil,則表示該視圖不處理手勢事件,反之則捕獲該事件。
當(dāng)方法返回nil的時候,我們可以追加判斷,是否‘點在了超出容器范圍的子控件上’,如果是則攔截事件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在開發(fā)過程中,大家或多或少的都會碰到令人頭疼的手勢沖突問題,正好前兩天碰到一個類似的bug,于是借著這個機(jī)會了解了...
    閆仕偉閱讀 5,698評論 2 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點擊了?糾結(jié)于如何實現(xiàn)這個奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,621評論 51 604
  • 整個國慶節(jié)除了中秋節(jié)那天休息了一天,幾乎每天都在工作,其實大家都知道生意難做,但是創(chuàng)業(yè)這條路是自己選擇的,所以不管...
    芷榮說閱讀 1,683評論 0 2
  • 生機(jī)暢達(dá),柔嫩之心
    薛功燦閱讀 255評論 0 0

友情鏈接更多精彩內(nèi)容