2016-05-31 69 views
0

您是否必須設置界限CAShapeLayerCAShapeLayer - 界限

我正在創建一個形狀圖層,並通過一個UIBezierPath爲其分配一個路徑,該圖形是一個簡單的視圖大小的圓。

我沒有在圖層上設置任何positionbounds,這是錯誤的嗎?

class View: UIView { 
... 

var backgroundLayer: CAShapeLayer! 

func setup() { 
    // call from init 
    backgroundLayer = CAShapeLayer() 
    backgroundLayer.strokeColor = UIColor.redColor() 
    backgroundLayer.lineWidth = 3 
    backgroundLayer.fillColor = UIColor.clearColor().CGColor 
    layer.addSublayer(backgroundLayer) 
    ... 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    backgroundLayer?.path = circlePath(100) 
    ... 
} 

func circlePath(progress: Int) -> CGPath { 
    let path = UIBezierPath() 
    let inverseProgress = 1 - CGFloat(progress)/100 
    let endAngleOffset = CGFloat(2 * M_PI) * inverseProgress 
    path.addArcWithCenter(localCenter, radius: radius, startAngle: CGFloat(-M_PI), endAngle: CGFloat(M_PI) - endAngleOffset, clockwise: true) 
    return path.CGPath 
} 

... 
} 

回答

1

正如您已經看到的那樣,即使沒有設置邊界,圖層也會顯示得很好。所以,你不必「設置它,但是沒有邊界(或者有一個不同於路徑邊界框的邊界)在做佈局或變換時有時可能會造成混淆。

當涉及到佈局,定位和轉換時,需要考慮幾個不同的座標。

  1. 到它的父的座標系統
  2. 的路徑是相對定位的形狀層的座標系統
  3. 路徑中的每個點相對於的原點(0,0)的層相對於定位路徑。

形狀圖層相對於其中心進行變形,並且形狀圖層的位置也位於其邊界的中心。這意味着如果形狀圖層沒有邊界(0×0)大小,則任何變換(例如旋轉)都會在路徑的原點(0,0)附近發生,而不是路徑的中心。這也意味着,在設置形狀圖層的位置時,人們在概念上定位路徑的起點,而不是路徑的中心。但是,如果路徑的原點碰巧是路徑邊界框的中心(例如以(0,0)爲中心的圓),那麼這不是問題。

因此,回顧一下:您不必設置邊界,但有時(取決於路徑)定位或轉換在設置時可能會更清晰。

+0

晶瑩剔透。 –