iOS實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果實(shí)例代碼
需求
利用圖片,實(shí)現(xiàn)一個如圖的按鈕組。

遇到的問題
如下圖所示:
- 功能1、2、3、4的按鈕可以實(shí)現(xiàn)點(diǎn)擊功能。但是在紅色方框四角的位置,也會響應(yīng)相應(yīng)的點(diǎn)擊事件。
- 紫色方框內(nèi)四角區(qū)域點(diǎn)擊時,響應(yīng)的方法是功能5,而不是對應(yīng)的功能。

解決思路
期望的結(jié)果
- 尋找到合適的Button來處理點(diǎn)擊事件
需要弄明白的問題
- 事件在如何傳遞的?
- 怎么判斷誰來處理當(dāng)前事件?
事件是如何傳遞的?
- 當(dāng)用戶觸摸實(shí)際屏幕時,會生成一個Touch Event,將此事件添加到UIApplication管理的事件隊(duì)列之中。
- UIApplication從事件隊(duì)列之中按順序取出事件分發(fā)到視圖去處理。
- 當(dāng)事件被發(fā)出以后,會從keyWindow開始,依次向上傳遞,包括Controller以及View,最后找到合適的視圖來響應(yīng)事件。
可以看出:當(dāng)一個事件發(fā)生后,事件會從父控件傳給子控件,也就是說由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的傳遞,也就是尋找最合適的view的過程。
涉及到兩個方法:
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? func point(inside point: CGPoint, with event: UIEvent?) -> Bool
當(dāng)UIApplication發(fā)送事件到keyWindow時,會調(diào)用 hitTest來尋找最合適的視圖處理事件。判斷邏輯如下:
- 首先判斷自身是否能夠響應(yīng)觸摸事件(
userInteractionEnabled==true、hidden==true、alpha<=0.01不能響應(yīng)觸摸事件),若能響應(yīng)則下一步,否則返回nil。 - 如果可以響應(yīng)觸摸事件,調(diào)用pointInside來判斷是否在顯示區(qū)域內(nèi),如果不在其中,pointInside返回false,同時hitTest返回nil。
- 如果 pointInside返回true,表示在當(dāng)前的視圖之中,然后倒序遍歷該視圖的子視圖,重復(fù)上述步驟,直到某一視圖可以響應(yīng),hitTest:返回該視圖。
- 如果執(zhí)行完上述步驟以后,沒有符合條件的視圖響應(yīng)事件,則返回視圖本身,表示只有當(dāng)前視圖符合條件,能夠處理該事件。
Q:為什么倒序遍歷?
A:因?yàn)樵趕ubViews數(shù)組中,最后添加的視圖,在視圖層級中處于最上方。
怎么判斷誰來處理當(dāng)前事件?
當(dāng)知道的上面事件傳遞機(jī)制后,我們就能理清楚我們的Button處理事件的邏輯了:
1、自定義Button繼承自系統(tǒng)的Button。
2、重寫 point(inside point: CGPoint, with event: UIEvent?) -> Bool 方法。在其中判斷當(dāng)前事件是否需要自身處理。
- 判斷點(diǎn)是否在自身
button.imageView的frame范圍內(nèi) - 得到點(diǎn)擊點(diǎn)在
button.imageView中該點(diǎn)的顏色值 - 如果得到的色值中alpha小于閥值,則返回false
具體代碼可以查看JTShapedButton源碼 (本地下載)。
實(shí)現(xiàn)效果

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS開發(fā)中音頻視頻播放的簡單實(shí)現(xiàn)方法
視頻音頻是我們在ios日常開發(fā)中經(jīng)常會遇到的一個需求,所以下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)中音頻視頻播放的簡單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
iOS中UITableView Cell實(shí)現(xiàn)自定義單選功能
本篇文章主要介紹了iOS中UITableView Cell實(shí)現(xiàn)自定義單選功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
iOS中時間與時間戳的相互轉(zhuǎn)化實(shí)例代碼
這篇文章主要介紹了iOS中時間與時間戳的相互轉(zhuǎn)化實(shí)例代碼,非常具有實(shí)用價值,需要的朋友可以參考下。2017-03-03
Objective-C const常量的優(yōu)雅使用方法
這篇文章主要為大家介紹了Objective-C const常量的優(yōu)雅使用方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
IOS 中UIKit-UIPageControl利用delegate定位圓點(diǎn)位置
這篇文章主要介紹了IOS 中UIKit-UIPageControl利用delegate定位圓點(diǎn)位置 的相關(guān)資料,需要的朋友可以參考下2017-04-04
iOS開發(fā)Quick Actions創(chuàng)建桌面Icon快捷方式
在本文里我們給大家分享了關(guān)于iOS開發(fā)Quick Actions創(chuàng)建桌面Icon快捷方式的相關(guān)知識點(diǎn)內(nèi)容,需要的讀者們可以參考下。2019-05-05
iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例
這篇文章主要介紹了iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例,編程語言依然是傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-09-09

