2017-03-08 34 views
0

我正在爲用戶創建一種方法來在屏幕上移動多邊形,並通過拖動角點頂點來更改它們的形狀。然後我需要能夠在其他設備上重新繪製這些修改的多邊形 - 所以我需要能夠在屏幕上獲得所有多邊形的所有頂點的最終位置。路徑轉換後可以獲取UIBezierPath當前控制點嗎?

這是我目前在做什麼:

我畫使用UIBezierPathdrawRect功能的覆蓋每個形狀的多邊形。然後,我允許用戶通過應用CGAffineTransformMakeTranslation函數和xy座標增量在touchedMoved函數覆蓋中在屏幕上拖動它們。我有初始控制點從中初始繪製多邊形(如描述here)。但是一旦路徑實例在屏幕上移動,這些值不會改變 - 所以我只能獲得初始值。

Core Graphics框架內有什麼內置的東西,可以讓我抓取UIBezierPath實例中的一組當前控制點?我試圖避免手動跟蹤這些點。我會考慮用其他方式吸引用戶,如果:

  • 有一個內置 - 中的方式來檢測一個點位於該多邊形內(如UIBezierPath#contains方法
  • 一種能夠方便地引入約束使用戶可以」 T移至多邊形走出上海華盈的界限(我需要整個多邊形是可見的)
  • 一種能夠方便地抓住所有的點,當用戶完成
  • 一切都可以在iPhone 5
下60fps的運行

感謝您的時間!

回答

1

由於您只將變換應用於視圖/圖層,要從路徑中獲取轉換後的控制點,只需將相同的變換應用於路徑,然後獲取控制點即可。喜歡的東西:

UIBezierPath* copiedPath = [myPath copy]; 
[copiedPath applyTransform:[view transform]]; 
[self yourExistingMethodToFetchPointsFromPath:copiedPath]; 

了目前正在從通道拉出點的方法是在不幸從輸入UIBezierPath可用於重新取點的唯一API。然而 - 你可能對我寫的一個圖書館感興趣,這個圖書館使貝塞爾路徑更簡單:PerformanceBezier。這個庫使得顯著更容易地從路徑獲得積分:

for(NSInteger i=0;i<[path elementCount];i++){ 
    CGPathElement element = [path elementAtIndex:n]; 
    // now you know the element.type and the element.points 
} 

除了增加功能,使道路更容易使用,它也增加了一個緩存層對現有的API,使性能的頂部打擊路徑要小得多。根據您在UIBezierPath方法上花費多少CPU時間,該庫將會有重大改進。我看到了between 2x and 10x improvement,這取決於我使用的操作。

相關問題