但是有時候會希望觸發手勢的區域會是在一個非矩形的範圍中;
還有想要使用手勢的 View 被疊在其他的 View 下面,
但是又不能改變它們的順序時。
以上兩種情況都可以使用 CGPath 來解決問題。
假設現在的情況如下,
我有一個矩形的 View,但是手勢的觸發區域想要在它的上半部的三角形中,
三角形下方的角剛好在 View 的正中央。
如下圖:

所以 Code 的寫法如下,這部分的 Code 可以實作在任一的 Method 中,
只要記得在需要時呼叫這個 Method 來建立這個路徑就好了。
首先要先將 CGPath 的變數宣告為全域變數
@interface viewController () { CGMutablePathRef triangle; } @end
之後就開始繪製這個路徑了
// 先取出 view 的基本資訊,像是 x\y 座標與長的數據,方便 CGPath 的建立 CGFolat x = view.frame.origin.x; CGFolat y = view.frame.origin.y; CGFolat width = view.frame.size.width; // 將 triangle 初始化 triangle = CGPathCreateMutable(); // 先給它一個啟始點,就是這個 View 的中心點 CGPathMoveToPoint(triangle, NULL, view.center.x, view.center.y); // 接下來從啟始點畫一條線到 View 的右上角 CGPathAddLineToPoint(triangle, NULL, x, y); // 再來從起始點再畫另一條線到 View 的左上方 CGPathAddLineToPoint(triangle, NULL, x + width, y); // 之後再封閉這個路徑,最後的一條線就會自動的補上了 CGPathCloseSubpath(triangle);
這時候畫出來的路徑是看不到的,
所以可以搭配之前教學的 UIBezierPath 來繪製可視的區域,
來看畫出來的區域有沒有錯。
接下來我要用點擊的手勢在這個路徑中觸發,這個手勢在建立 View 的時候就被加在 View 裡面了,
所以就直接在手勢觸發的 Method 來實作了。
- (IBAtion)tapGesture:(UITapGestureRecognizer *)sender { // 取得現在的點擊座標 CGPoint tapPoint = [sender locationInView:sender.view]; // 判斷點擊的座標時否在這個路徑裡面 if (CGPathContainsPoint(triangle, NULL, tapPoint, NO)) { NSLog(@"Taped !!"); } }
這樣子就完成了,至於要怎麼實作就靠大家自己發揮了,
另外這個路徑不只能畫直線與 UIBezierPath 一樣可以畫圓弧、貝茲曲線等等,
這次的教學就到這邊,下次再見了。
沒有留言:
張貼留言