iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果

這篇文章主要介紹了iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),萍鄉(xiāng)網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:萍鄉(xiāng)等地區(qū)。萍鄉(xiāng)做網(wǎng)站價(jià)格咨詢:18980820575

需求

利用圖片,實(shí)現(xiàn)一個(gè)如圖的按鈕組。

iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果

遇到的問(wèn)題

如下圖所示:

  • 功能1、2、3、4的按鈕可以實(shí)現(xiàn)點(diǎn)擊功能。但是在紅色方框四角的位置,也會(huì)響應(yīng)相應(yīng)的點(diǎn)擊事件。

  • 紫色方框內(nèi)四角區(qū)域點(diǎn)擊時(shí),響應(yīng)的方法是功能5,而不是對(duì)應(yīng)的功能。

iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果

解決思路

期望的結(jié)果

  • 尋找到合適的Button來(lái)處理點(diǎn)擊事件

需要弄明白的問(wèn)題

  • 事件在如何傳遞的?

  • 怎么判斷誰(shuí)來(lái)處理當(dāng)前事件?

事件是如何傳遞的?

  1. 當(dāng)用戶觸摸實(shí)際屏幕時(shí),會(huì)生成一個(gè)Touch Event,將此事件添加到UIApplication管理的事件隊(duì)列之中。

  2. UIApplication從事件隊(duì)列之中按順序取出事件分發(fā)到視圖去處理。

  3. 當(dāng)事件被發(fā)出以后,會(huì)從keyWindow開(kāi)始,依次向上傳遞,包括Controller以及View,最后找到合適的視圖來(lái)響應(yīng)事件。

可以看出:當(dāng)一個(gè)事件發(fā)生后,事件會(huì)從父控件傳給子控件,也就是說(shuō)由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的傳遞,也就是尋找最合適的view的過(guò)程。

涉及到兩個(gè)方法:

func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
func point(inside point: CGPoint, with event: UIEvent?) -> Bool

當(dāng)UIApplication發(fā)送事件到keyWindow時(shí),會(huì)調(diào)用 hitTest來(lái)尋找最合適的視圖處理事件。判斷邏輯如下:

  1. 首先判斷自身是否能夠響應(yīng)觸摸事件(userInteractionEnabled==true、hidden==truealpha<=0.01不能響應(yīng)觸摸事件),若能響應(yīng)則下一步,否則返回nil。

  2. 如果可以響應(yīng)觸摸事件,調(diào)用pointInside來(lái)判斷是否在顯示區(qū)域內(nèi),如果不在其中,pointInside返回false,同時(shí)hitTest返回nil。

  3. 如果 pointInside返回true,表示在當(dāng)前的視圖之中,然后倒序遍歷該視圖的子視圖,重復(fù)上述步驟,直到某一視圖可以響應(yīng),hitTest:返回該視圖。

  4. 如果執(zhí)行完上述步驟以后,沒(méi)有符合條件的視圖響應(yīng)事件,則返回視圖本身,表示只有當(dāng)前視圖符合條件,能夠處理該事件。

 Q:為什么倒序遍歷?
 A:因?yàn)樵趕ubViews數(shù)組中,最后添加的視圖,在視圖層級(jí)中處于最上方。

怎么判斷誰(shuí)來(lái)處理當(dāng)前事件?

當(dāng)知道的上面事件傳遞機(jī)制后,我們就能理清楚我們的Button處理事件的邏輯了:

1、自定義Button繼承自系統(tǒng)的Button。

2、重寫(xiě) 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)效果

iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

新聞標(biāo)題:iOS如何實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果
鏈接URL:http://muchs.cn/article16/ipjsdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)做網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣品牌網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管