- 蘋果並沒有設置自動將
CAShapeLayer
的frame
或bounds
如果設置了(和蘋果還沒有實現的[UIView sizeThatFits]
等效) - 使用路徑邊界框大小的框架......一切都會出錯。無論你如何嘗試設置它,它的螺絲式路徑
那麼,什麼是通過編程設定一個新增CGPath
新創建CAShapeLayer
框架下的正確方法是什麼?蘋果的文件在這件事上保持沉默。
事情我已經試過了,不工作:
- 創建
CAShapeLayer
- 創建
CGPath
,將它添加到層 - 檢查層的
frame
- 這是{{0,0},{0,0}}
- 設置:
layer.frame = CGPathGetBoundingBox(layer.path)
幀現在是正確的,但路徑現在是DOUBLE偏移量 - 將
frame
使路徑有效地轉移額外(x,y)
像素集:
layer.bounds = CGPathGetBoundingBox(layer.path)
- ...這一切都瘋了。沒有任何意義更
- 嘗試修復它通過做
layer.position = CGPathGetBoundingBox(layer.path).origin
- ...沒有骰子;仍然堅果。
有一件事我已經試過了沒有工作,但會導致問題的其他地方:
編輯:此儘快遊爲你自動旋轉屏幕。我的猜測:蘋果的自動旋轉需要控制「變形」屬性。
- 創建
CAShapeLayer
- 創建
CGPath
,將它添加到層 - 檢查層的框架 - 這是
{{0,0},{0,0}}
- 集:
layer.frame = CGPathGetBoundingBox(layer.path)
- 集:
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)
」。再次,這是可行的 - 但它是非常複雜的)
你有沒有找到解決方案? – jannej 2012-12-17 12:31:13
還沒有。我目前正在使用問題本身的解決方法。這很慢,很難維持。我認爲這個問題是蘋果代碼中的一個錯誤,也許吧? – Adam 2012-12-17 12:55:33
一個小附錄:我最終發現「.frame」不受Apple支持。這很奇怪,因爲它在各地都有使用 - 但是如果你在文檔和/或Apple郵件列表中深入挖掘,你會發現Apple工程師提供的說明並不打算工作,他們也不會修復它的錯誤。您預計/需要爲所有事情使用.bounds,並將.frame視爲「只讀」。所以它特別具有諷刺意味的是,在這種情況下,設置.frame「幾乎可行」,其中設置.bounds「永遠不會工作」:) – Adam 2013-05-02 09:12:06