2013-09-23 143 views
9

我正在研究CAShapeLayer。並嘗試繪製非線性路徑。我想將幀設置爲CAShapeLayer。因此,我可以使用CGPathGetPathBoundingBox方法從CGPathRef獲取幀。CAShapeLayer的框架和邊界

這裏是代碼:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [[CAShapeLayer alloc]init]; 
arcLayer.path = path; 
arcLayer.frame = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = CGPathGetPathBoundingBox(path); 
[self.layer addSublayer:arcLayer]; ` 

請參考我的代碼仔細。我已設置相同的框架和範圍,以CAShapeLayer.My問題是,如果我沒有設置界限(同幀),那麼它不會顯示我的內容,也不會在框架內顯示我的內容。爲什麼?請幫助我。謝謝你。

回答

8

下面是從CALayer文檔報價:

的框架矩形在superlayer的座標空間中指定的層的位置和大小。對於圖層,框架矩形是從邊界,anchorPoint和位置屬性中的值派生的計算屬性。爲此屬性分配新值時,圖層將更改其位置和邊界屬性以匹配您指定的矩形。矩形中每個座標的值均以點爲單位進行度量。

看起來與CAShapeLayer設置frame本身,當它簡化版,從分配的CGRect保持原點的值,只有大小。當您設置bounds時,原點將保留並顯示在正確的位置。你還需要將位置值設置爲您希望您的中心點狀地顯示:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [CAShapeLayer layer]; 
arcLayer.path = path; 
CGRect pathRect = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = pathRect; 
arcLayer.position = CGPointMake(CGRectGetMidX(pathRect), CGRectGetMidY(pathRect)); 
[self.layer addSublayer:arcLayer]; 
+0

所以,在句子中:不要設置'frame',只是'bounds',並且設置'position'? –

+3

是的。雖然,我認爲500分的問題需要稍微更詳細的回答。 –

+0

通常對於圖層,我認爲您可以通過設置_bounds_ + _position_而不是_frame_來獲得最佳結果。但對於CAShapeLayer,我不認爲邊界是重要的,除非你想添加翻譯的內容。但是這並不能解釋爲什麼路徑不被繪製嗎? – nielsbot

15

當修改CALayerframe,要修改它的大小和位置的座標空間它的超級玩家。 frame是一個計算值,基於對象的boundsposition。在這種情況下,圖層還沒有超層,因此其座標空間無量綱。當您設置frame時,尺寸會進入bounds屬性,但由於無量綱空間中的任意點爲零,因此位置將保持爲零,而不是您的預期。

爲了解決這個問題,你可以設置bounds設置圖層的大小,然後在超級圖層的座標空間中設置position(這是一個真正的非計算屬性),然後將其添加爲子圖層。

0

根據我的經驗,將position設置爲CAShapeLayer就足以讓它顯示出您想要的位置。爲此設置bounds不是必需的。

請參閱CoreAnimationText示例代碼以便使用它。

+1

這取決於你在後面對圖層做什麼。如果你嘗試用空的'bounds'來轉換它,結果可能會很搞笑。 –

+0

有趣。我做了很多'CAShapeLayer'對象的轉換,這些對象被分組爲另一個'CALayer'的子層。幸運的是,我從來沒有問題。請記住,如果歡鬧會隨之而來。 – JanX2

0

您需要設置bounds否則它的行爲將如anchorPoint設置爲[0, 0]。誰想要那個? :D