【问题标题】:CAShapeLayer - boundsCAShapeLayer - 边界
【发布时间】:2016-05-31 13:27:48
【问题描述】:

您必须设置CAShapeLayer 的边界吗?

我正在创建一个形状图层并通过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
}

...
}

【问题讨论】:

    标签: core-graphics calayer cashapelayer


    【解决方案1】:

    正如您已经看到的,即使不设置边界,图层也会正常显示。因此,您不必“必须”设置它,但在进行布局或转换时,没有边界(或具有不同于路径边界框的边界)有时会令人困惑。

    在布局、定位和转换方面,需要考虑几个不同的坐标。

    1. 图层相对于其父坐标系定位
    2. 路径相对于形状图层的坐标系定位
    3. 路径中的每个点都相对于路径的原点 (0,0)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多