2013-05-13 112 views
0

我正在繪製一系列UIBezierPath,它們都有不同的大小和位置。我想將每個形狀縮放到特定尺寸並將其移動到UIView上的特定位置。我正在與CGAffineTransformation工作。它很快變得混亂,因爲位置和大小不適用於所有形狀。動態縮放和平移形狀

有沒有什麼辦法可以將UIBezierPath縮放到一個特定的尺寸,並將它翻譯(移動)到一個可以適用於大多數形狀的特定位置?也許有一種方法可以設置形狀的大小和位置,而無需使用我不知道的轉換?我繪製的形狀在尺寸上都非常不同,有些邊緣鋸齒狀。

這是我到目前爲止與我的AffineTransformations做的。

CGAffineTransform scale = CGAffineTransformMakeScale(2.0f,2.0f); 
[path applyTransform:scale]; 

CGAffineTransform move = CGAffineTransformMakeTranslation(-10, -10); 
[path applyTransform:move]; 

pathUIBezierPath

這是正確的嗎?我使用的值(-10,2.0f)僅僅是示例。

回答

0

我認爲解決這個問題的最好辦法是將路徑轉換成CAShapeLayer並設置圖層的位置和大小。非常簡單和優雅。但是,根據實施情況,您將需要解決一些錯誤。

myCAShapeLayer.path = myUIBezierPath.path; 
myCAShapeLayer.position = CGRectMake(x, y); 

CALayers太棒了!

0

您正在尋找的是如何將仿射變換應用於貝塞爾路徑。當然可以,用這種方法:

- (void)applyTransform:(CGAffineTransform)transform; 

這是怎麼了結構定義:

struct CGAffineTransform { 
    CGFloat a; 
    CGFloat b; 
    CGFloat c; 
    CGFloat d; 
    CGFloat tx; 
    CGFloat ty; 
}; 
typedef struct CGAffineTransform CGAffineTransform; 

和字段含義:



入口位置[1,1]在矩陣中。
b
矩陣中[1,2]位置的條目。
c
矩陣中位置[2,1]處的條目。
d
矩陣中位置爲[2,2]的條目。
tx
矩陣中位置[3,1]處的條目。
ty
矩陣中位置[3,2]處的條目。

參考:

CGAffineTransform
UIBezierPath

+0

我在原文中提到我目前正在使用AffineTransformations,並且他們工作得不好。如果你相信這是我應該做的,你能否提供一個更好的解釋,我應該如何應用這個轉變? – tentmaking 2013-05-13 22:30:25

+0

請注意,您在回答您的問題後添加了代碼。該代碼應該是正確的,那麼如果它不起作用,你在另一部分代碼中做錯了。如果仍然存在一些不需要的行爲,請顯示完整的代碼。 – 2013-05-14 11:53:27

+0

我在回答問題後添加了代碼,但我最初提到我使用CGAffineTransformations。無論哪種方式,我找到了一個解決方案,並會盡快發佈。 – tentmaking 2013-05-14 21:46:38