2011-12-29 28 views
15

簡而言之:設置一個新創建正確的框架CAShapeLayer

  1. 蘋果並沒有設置自動將CAShapeLayerframebounds如果設置了(和蘋果還沒有實現的[UIView sizeThatFits]等效)
  2. 使用路徑邊界框大小的框架......一切都會出錯。無論你如何嘗試設置它,它的螺絲式路徑

那麼,什麼是通過編程設定一個新增CGPath新創建CAShapeLayer框架下的正確方法是什麼?蘋果的文件在這件事上保持沉默。

事情我已經試過了,不工作:

  1. 創建CAShapeLayer
  2. 創建CGPath,將它添加到層
  3. 檢查層的frame - 這是{{0,0},{0,0}}
  4. 設置:layer.frame = CGPathGetBoundingBox(layer.path)
  5. 幀現在是正確的,但路徑現在是DOUBLE偏移量 - 將frame使路徑有效地轉移額外(x,y)像素

  6. 集:layer.bounds = CGPathGetBoundingBox(layer.path)

  7. ...這一切都瘋了。沒有任何意義更
  8. 嘗試修復它通過做layer.position = CGPathGetBoundingBox(layer.path).origin
  9. ...沒有骰子;仍然堅果。

有一件事我已經試過了沒有工作,但會導致問題的其他地方:

編輯:此儘快遊爲你自動旋轉屏幕。我的猜測:蘋果的自動旋轉需要控制「變形」屬性。

  1. 創建CAShapeLayer
  2. 創建CGPath,將它添加到層
  3. 檢查層的框架 - 這是{{0,0},{0,0}}
  4. 集:layer.frame = CGPathGetBoundingBox(layer.path)
  5. 集:layer.transform = CGAffineTransformMakeTranslation(CGPathGetBoundingBox(layer.path).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

這工作,但是......許多第三方代碼假設初始變換f或CALayer是身份。

它不應該這麼難!當然,我在這裏做錯了什麼?

(我有一個建議:「每次你添加一個路徑,手動運行一個自定義函數,將所有的點移動-1 * (top-left-point.x, top-left-point.y)」。再次,這是可行的 - 但它是非常複雜的)

+0

你有沒有找到解決方案? – jannej 2012-12-17 12:31:13

+0

還沒有。我目前正在使用問題本身的解決方法。這很慢,很難維持。我認爲這個問題是蘋果代碼中的一個錯誤,也許吧? – Adam 2012-12-17 12:55:33

+3

一個小附錄:我最終發現「.frame」不受Apple支持。這很奇怪,因爲它在各地都有使用 - 但是如果你在文檔和/或Apple郵件列表中深入挖掘,你會發現Apple工程師提供的說明並不打算工作,他們也不會修復它的錯誤。您預計/需要爲所有事情使用.bounds,並將.frame視爲「只讀」。所以它特別具有諷刺意味的是,在這種情況下,設置.frame「幾乎可行」,其中設置.bounds「永遠不會工作」:) – Adam 2013-05-02 09:12:06

回答

4

將layer.bounds設置爲路徑邊界是正確的做法 - 要使圖層的本地座標空間與路徑匹配。但是,您還需要設置圖層的位置屬性,將其移動到其超級圖層中的正確位置。 (設置.frame轉換爲框架爲您計算.bounds和.position的正確值,但它始終保持bounds.origin不變,當您的路徑邊界具有非零原點時,這不是您想要的。 。)

所以這樣的事情應該工作,假設你已經無法從常規(.5,.5)值改變anchorPoint,並希望該層的superlayer的起源沖洗位置:

CGRect r = CGPathGetBoundingBox(layer.path); 
layer.bounds = r; 
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5);