CAShapeLayer - 边界
CAShapeLayer - bounds
是否必须设置 CAShapeLayer
的边界?
我正在创建一个形状图层并通过 UIBezierPath
为其分配路径,该形状是视图大小的简单圆圈。
我没有在图层上设置任何position
或bounds
,是不是错了?
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
}
...
}
如您所见,即使不设置边界,图层也能正常显示。因此,您没有 "have to" 设置它,但没有边界(或边界与路径的边界框不同)有时在进行布局或转换时会造成混淆。
在布局、定位和转换方面,有几个不同的坐标需要考虑。
- 图层相对于其父坐标系定位
- 路径相对于形状图层的坐标系定位
- 路径中的每个点都相对于路径的原点 (0,0)。
形状图层相对于其中心进行变换,形状图层的位置也位于其边界的中心。这意味着如果形状层没有边界 (0×0) 大小,那么任何变换(例如旋转)都会发生在路径 (0,0) 的原点周围,而不是路径的中心。这也意味着在设置形状层的位置时,概念上是定位路径的原点,而不是路径的中心。但是,如果路径的原点恰好是路径边界框的中心(例如以 (0,0) 为中心的圆),那么这并不是真正的问题。
因此,回顾一下:您不必设置边界,但有时(取决于路径)定位或变换在设置时可能会更清晰。
是否必须设置 CAShapeLayer
的边界?
我正在创建一个形状图层并通过 UIBezierPath
为其分配路径,该形状是视图大小的简单圆圈。
我没有在图层上设置任何position
或bounds
,是不是错了?
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
}
...
}
如您所见,即使不设置边界,图层也能正常显示。因此,您没有 "have to" 设置它,但没有边界(或边界与路径的边界框不同)有时在进行布局或转换时会造成混淆。
在布局、定位和转换方面,有几个不同的坐标需要考虑。
- 图层相对于其父坐标系定位
- 路径相对于形状图层的坐标系定位
- 路径中的每个点都相对于路径的原点 (0,0)。
形状图层相对于其中心进行变换,形状图层的位置也位于其边界的中心。这意味着如果形状层没有边界 (0×0) 大小,那么任何变换(例如旋转)都会发生在路径 (0,0) 的原点周围,而不是路径的中心。这也意味着在设置形状层的位置时,概念上是定位路径的原点,而不是路径的中心。但是,如果路径的原点恰好是路径边界框的中心(例如以 (0,0) 为中心的圆),那么这并不是真正的问题。
因此,回顾一下:您不必设置边界,但有时(取决于路径)定位或变换在设置时可能会更清晰。