【发布时间】:2020-12-03 00:42:16
【问题描述】:
我试图了解CAShapeLayer 以及它的亮点。主要优势似乎是您可以方便地访问的形状样式属性:
let shapeLayer = CAShapeLayer()
shapeLayer.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: .init(width: 200, height: 200))
shapeLayer.fillColor = .none
shapeLayer.lineWidth = 5
shapeLayer.strokeColor = UIColor.blue.cgColor
let path = UIBezierPath()
let withCenter = CGPoint(x: 100, y: 100)
let radius = CGFloat(100)
let startAngle = CGFloat(0.0)
let endAngle = CGFloat(CGFloat.pi * 2)
path.addArc(withCenter: withCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
shapeLayer.path = path.cgPath
但是,我认为优势到此为止。它反而会限制您将上下文设置为多种状态(例如不同路径的颜色)的能力,并且需要新的CAShapeLayer。我可以覆盖绘图方法或使用委托,但在这种情况下,这与 CALayer 做的事情相同。
另一方面,CALayer:
let layer = CALayer()
layer.frame = CGRect(origin: CGPoint(x: 100, y: 300), size: .init(width: 200, height: 200))
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 200, height: 200))
let image = renderer.image { (_) in
let path = UIBezierPath()
let withCenter = CGPoint(x: 100, y: 100)
let radius = CGFloat(100)
let startAngle = CGFloat(0.0)
let endAngle = CGFloat(CGFloat.pi * 2)
path.lineWidth = 5
UIColor.blue.setStroke()
path.addArc(withCenter: withCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
path.stroke()
}
layer.contents = image.cgImage
您可以为不同的路径设置多种笔触颜色。显然,您可以以类似的方式设置CAShapeLayer 的contents,但我想利用CAShapeLayer 的API 而CALayer 不提供。
形状样式属性是CAShapeLayer的主要原因吗?
【问题讨论】:
-
当然,这只是一种方便,就像 CATextLayer 等,对于一个简单的情况,一个带有笔触和填充颜色的贝塞尔路径/CGPath。如果您不想使用它,请不要使用它。如果你这样做,就这样做。
-
然而,它可以做的一件你会发现很难模仿的事情是当你为它的属性设置动画时,尤其是
strokeEnd。实际上,您可能不知道如何使用贝塞尔路径来处理形状层对strokeStart和strokeEnd的处理。 -
缩放图像而不是形状图层将无法获得相同的结果
-
IIRC,
CAShapeLayer绘制的形状是矢量图形,而CALayer,按照您的方式绘制的是位图图像。尝试使用CGAffineTransform缩放两个图层。 -
@matt 好吧,由于存在关键路径这一事实,我们可以为这些属性设置动画,尽管不是全部。我能够为
strokeStart、strokeEnd、lineWidth、miterLimit甚至path本身设置动画。
标签: ios swift core-animation calayer cashapelayer