遇到一個需求是在頁面上添加下面這樣一個圖片,根據用戶點擊的不同位置,讓響應區域變顏色,以達到模擬按鈕的感覺。
不同響應區域的變顏色的圖片,UI給了 只有該區域變顏色,其他部分爲透明 這樣的圖片。
先將上面這個未點擊的圖片添加在xib,然後依次添加不同位置點擊的圖片在上面並設置hide爲yes。
所以在判定完用戶點擊的位置在某個區域中時,只需要將該圖片hide設置爲no,然後在touchesEnd方法中重新設置hide爲yes即可。
那麼該怎麼判斷用戶點擊了圖片中的那個區域呢?
1.一開始想到的是用數學的辦法,計算出不同區域的rect,然後在點擊方法中用區域去判斷,但是有些複雜,有沒有簡單一些的辦法呢?
2.貝塞爾曲線。這是一個神器,只需要用貝塞爾曲線畫出不同的區域,然後用
- (BOOL)containsPoint:(CGPoint)point;
這個方法去判斷是否在區域內即可。
如何用貝塞爾曲線畫圓和扇形呢?只要用到了貝塞爾曲線的這兩個方法:
//畫圓弧
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
//畫圓
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
那麼如何具體畫一個扇形呢:
這裏有一個小技巧:
先以圓心爲中點,從1的位置爲開始畫圓弧到2,然後再以圓心爲中點,從3的位置畫圓弧到4。
(注意:兩次畫圓弧的方向是相反的) (BOOL)clockwise 控制方向。
然後調用
- (void)closePath;
方法即可完成2到3,4到1之間的線的自動封閉,一個扇形區域就完成了。
下面說一下貝塞爾曲線基礎,開始位置如下圖右方即0和2PI的位置,從開始位置往上是逆時針,往下是順時針。