CAShapeLayer - 界限

问题描述:

您是否必须设置界限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. 到它的父的坐标系统
  2. 的路径是相对定位的形状层的坐标系统
  3. 路径中的每个点相对于的原点(0,0)的层相对于定位路径。

形状图层相对于其中心进行变形,并且形状图层的位置也位于其边界的中心。这意味着如果形状图层没有边界(0×0)大小,则任何变换(例如旋转)都会在路径的原点(0,0)附近发生,而不是路径的中心。这也意味着,在设置形状图层的位置时,人们在概念上定位路径的起点,而不是路径的中心。但是,如果路径的原点碰巧是路径边界框的中心(例如以(0,0)为中心的圆),那么这不是问题。

因此,回顾一下:您不必设置边界,但有时(取决于路径)定位或转换在设置时可能会更清晰。

+0

晶莹剔透。 –