需求
利用圖片,實現一個如圖的按鈕組。
遇到的問題
如下圖所示:
解決思路
期望的結果
需要弄明白的問題
事件是如何傳遞的?
可以看出:當一個事件發生后,事件會從父控件傳給子控件,也就是說由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的傳遞,也就是尋找最合適的view的過程。
涉及到兩個方法:
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?func point(inside point: CGPoint, with event: UIEvent?) -> Bool
當UIApplication發送事件到keyWindow時,會調用 hitTest來尋找最合適的視圖處理事件。判斷邏輯如下:
userInteractionEnabled==true
、hidden==true
、alpha<=0.01
不能響應觸摸事件),若能響應則下一步,否則返回nil。Q:為什么倒序遍歷?
A:因為在subViews數組中,最后添加的視圖,在視圖層級中處于最上方。
怎么判斷誰來處理當前事件?
當知道的上面事件傳遞機制后,我們就能理清楚我們的Button處理事件的邏輯了:
1、自定義Button繼承自系統的Button。
2、重寫 point(inside point: CGPoint, with event: UIEvent?) -> Bool
方法。在其中判斷當前事件是否需要自身處理。
button.imageView
的frame范圍內button.imageView
中該點的顏色值具體代碼可以查看JTShapedButton源碼 (本地下載)。
實現效果
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。
新聞熱點
疑難解答