iOS擴大按鈕的點擊范圍

前言

  • 前端頁面開發(fā)中,經(jīng)常用到按鈕,按鈕的圖片是比較小的,但是需要擴大按鈕的點擊范圍.這時,我們一般會想到在響應(yīng)鏈上動手

  • hitTest

/// 返回視圖層次結(jié)構(gòu)(包括它自己)中包含指定點的接收方的最遠后代。
func hitTest(_ point: CGPoint, 
        with event: UIEvent?) -> UIView?
  • 這個方法通過調(diào)用每個子視圖的point(inside:with:)方法來遍歷視圖層次結(jié)構(gòu),以確定哪個子視圖應(yīng)該接收觸摸事件。如果point(inside:with:)返回true,則子視圖的層次結(jié)構(gòu)將被類似地遍歷,直到找到包含指定點的最前面的視圖為止。如果一個視圖不包含這個點,它的視圖層次結(jié)構(gòu)分支將被忽略。你很少需要自己調(diào)用這個方法,但是你可以覆蓋它來隱藏子視圖中的觸摸事件。
  • 此方法忽略隱藏的、禁用用戶交互或alpha級別小于0.01的視圖對象。在確定命中時,此方法不考慮視圖的內(nèi)容。因此,即使指定的點位于視圖內(nèi)容的透明部分,視圖仍然可以被返回。
  • 位于接收方邊界之外的點永遠不會被報告為命中,即使它們實際上位于接收方的子視圖之一。如果當(dāng)前視圖的clipsToBounds屬性設(shè)置為false并且受影響的子視圖擴展超出了視圖的邊界,就會發(fā)生這種情況。

實現(xiàn)方案

  • 擴大的點擊區(qū)域,我們不用去給按鈕添加上下左右單獨的屬性,直接用UIEdgeInsets即可,方便直觀,不容易設(shè)置錯誤
  • 下面是實現(xiàn)代碼
open class EnlargeEdgeButton: UIButton {
    
    open var enlargeEdge: UIEdgeInsets = .zero
    
    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if alpha == 0 || isHidden == true || enlargeEdge == .zero {
            return super.hitTest(point, with: event)
        }
        let rect = bounds.enlargeRect(edgeInsets: enlargeEdge)
        return rect.contains(point) ? self : nil
    }
}

extension CGRect {
    public func enlargeRect(edgeInsets: UIEdgeInsets) -> CGRect {
        return CGRect(x: minX - edgeInsets.left, y: minY - edgeInsets.top, width: width + (edgeInsets.left + edgeInsets.right), height: height + (edgeInsets.top + edgeInsets.bottom))
    }
}
  • 這是特別需要注意的是,按鈕的幾種特殊情況,需要做處理
  1. alpha == 0,透明度為0時,相當(dāng)是按鈕是看不見的,那么這時,我們的期望時按鈕是隱藏狀態(tài)的,如果這里加了擴大按鈕點擊范圍的代碼,會導(dǎo)致雖然按鈕是隱藏的,但是點擊按鈕的放大區(qū)域,還是會響應(yīng)事件,這會出現(xiàn)一個非常奇怪的bug,而且bug還不好找,本人在工作中就出現(xiàn)過這個失誤
    2.isHidden == true,同理,隱藏狀態(tài)時更不應(yīng)該去擴大點擊范圍了
    3.enlargeEdge == .zero,擴大區(qū)域的edge為.zero,相當(dāng)于是沒有加點擊范圍,那就可以直接調(diào)用父類方法,不做額外處理

分類 VS 子類化

  • 個人覺得的分類的侵入性比較大,如果給UIButton添加分類屬性enlargeEdge,導(dǎo)致任何繼承自UIButton的類都有這個功能.有可能人家壓根就不想要這個功能,但是你本來就有這個功能
  • 子類化的話,你想要這個功能,你就用這個類,或者繼承自這個類,能夠做到精準控制
?著作權(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)容

  • 最近做項目的過程遇到一個問題:UI妹子設(shè)計的button太小,每次點擊都很費勁,所以就想著有沒有什么方法可以在不改...
    楊桃wd閱讀 3,237評論 24 9
  • iOS 擴大按鈕的點擊范圍 首先要自定義一個按鈕 重寫方法-(BOOL)pointInside:(CGPoint)...
    鄒鄒_ZZ閱讀 3,091評論 0 1
  • 利用runtime和- (nullable UIView *)hitTest:(CGPoint)point wit...
    linbj閱讀 578評論 0 0
  • 怎樣來實現(xiàn)這個功能呢?又有多少種方式可以實現(xiàn)呢?下面一一來講。 理解事件傳遞過程,用這個來實現(xiàn)擴大點擊范圍使用Ru...
    karven閱讀 7,500評論 2 59
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 5,978評論 0 5

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