我開始使用原生iPad應用程序(如果需要,我們可以假設iOS 4.3+),我需要有一系列相互碰撞的彎曲區域。如何檢測/處理彎曲區域上的觸摸事件?
我很想要處理的最佳方式了一些建議。
我以爲有一個想法是使用WebView,只有一個JPG和一個HTML圖像映射,但我真的更喜歡使用某種支持曲線的原生UI元素。
有什麼建議嗎?
我開始使用原生iPad應用程序(如果需要,我們可以假設iOS 4.3+),我需要有一系列相互碰撞的彎曲區域。如何檢測/處理彎曲區域上的觸摸事件?
我很想要處理的最佳方式了一些建議。
我以爲有一個想法是使用WebView,只有一個JPG和一個HTML圖像映射,但我真的更喜歡使用某種支持曲線的原生UI元素。
有什麼建議嗎?
我們有一個問題是這樣的。爲了解決這個問題,我們在Adobe Illustrator中創建了一個黑白麪具。你需要爲每個你想要的區域做這件事。
接下來,我們導出了這個文件。我不記得文件導出選項,但基本上你會得到一個文本文件,其中包含行,貝塞爾曲線等路徑數據的負載。
然後,我們拿了這個文件,並寫了一個進口商,解析它,創建了一個CGPath。
最後階段是容易的一點。您從UITouch獲取觸點並執行CGPathContainsPoint調用。
下面是一些僞代碼如下:
跳過行,直到我們得到一個「1個XR」。這是後續行中有意義的 指示。
使用「」的分隔符將行拆分爲組件數組。
該行的最後一個組件是動作。如果它是「m」,這是一個路徑移動,如果它是「C」,它是一條更加緩慢的曲線,如果它是「L」,則它是一條線。
如果這是一個「Y」或「V」,那麼你需要獲得前行的組成部分,並解析如下:
(A)成分的計數包括動作,所以我們需要減少這個。例如。 274.5600 463.6800 m (b)如果這條線有四個座標並且前一個有兩個座標,那麼它是一個貝塞爾節點的點節點。圖你的貝塞爾曲線點如下:
cp1x = previous line's components object at index 0
cp1y = previous line's components object at index 1
cp2x = this line's components object at index 0
cp2y = this line's components object at index 1
x = this line's components object at index 2
y = this line's components object at index 3
(c)否則,如果此行有四個座標和前行有四個或六個座標圖如下:
cp1x = this line's components object at index 0
cp1y = this line's components object at index 1
cp2x = this line's components object at index 2
cp2y = this line's components object at index 3
x = this line's components object at index 2
y = this line's components object at index 3
其中Cp爲「控制點「。所以你有控制點一和控制點二與他們各自的x和y座標。
這聽起來像是一個很好的方法對我來說。我很確定我們已經有了我將在Illustrator中使用的區域,我很樂意看到您的一些代碼。 –
會做。讓我仔細檢查我的老闆,他不介意我張貼一些摘錄!... –
任何你可以分享將是太棒了。謝謝! –
創建各自代表不同的區域的貝塞爾路徑(通過做lineToPoint
或類似的函數)。
UIBezierPath *p1 = [UIBezierPath bezierPath];
[path1 lineToPoint:somePoint];
[pointArray1 addObject:NSStringFromCGPoint(somePoint)];
// create lots of points and close p1 path
然後找到凹形一些三角算法,會變成每一個貝塞爾路徑三角形陣列(即而不是存儲貝塞爾曲線點座標數組你存儲三角形座標的數組(數組的數組點)算法和解釋,可以在任何遊戲發展論壇,甚至在GameDev of stack exchange找到。
重複貝塞爾路徑創建和三角測量每個區域。
然後有這些陣列,它只是一個簡單的迭代的事檢查某個興趣點是否在o中ne這些三角形。
更新似乎@omz評論使我的答案也沒用,所以它只是一個創造貝塞爾路徑,並呼籲他們每個人的方法的問題。)
創建貝塞爾路徑,對它們進行三角化(作爲凹形),然後檢查點是否在任何三角形中。 – Eimantas
Eimantas,聽起來很有趣。你能否爲我提一點這個概念? –
你不必三角化你的bezier路徑,'UIBezierPath'已經有一個'containsPoint:'方法。 – omz