如何将 CAShapeLayer 对齐到 parent 视图
How to align CAShapeLayer To parent View
我有一个贝塞尔路径形状,我需要将其设置为 parent 视图框架形状。我需要将它缩放到正确的大小,以便它可以适合自己的 parent 作为边框。
我正在使用 CAShapeLayer 将贝塞尔曲线路径添加到 parent 视图子图层,然后对其进行动画处理。
class FrameView: NSObject {
var shapeLayer: CAShapeLayer!
func frameLayer(frame targetFrame: UIView) -> CAShapeLayer {
let bezierPath = UIBezierPath()
bezierPath.move(to: CGPoint(x: 34.93, y: 0))
bezierPath.addCurve(to: CGPoint(x: 36.05, y: 0.2), controlPoint1: CGPoint(x: 34.79, y: 0), controlPoint2: CGPoint(x: 35.45, y: -0))
bezierPath.addLine(to: CGPoint(x: 36.16, y: 0.22))
bezierPath.addCurve(to: CGPoint(x: 38, y: 2.85), controlPoint1: CGPoint(x: 37.27, y: 0.63), controlPoint2: CGPoint(x: 38, y: 1.68))
bezierPath.addCurve(to: CGPoint(x: 38, y: 3), controlPoint1: CGPoint(x: 38, y: 3), controlPoint2: CGPoint(x: 38, y: 3))
// MORE CODE FOR BEZIERPATH ...
bezierPath.apply(CGAffineTransform(translationX: targetFrame.bounds.minX, y: targetFrame.bounds.minY))
bezierPath.apply(CGAffineTransform(scaleX: 2.0, y: 2.0))
self.shapeLayer = CAShapeLayer()
shapeLayer.path = bezierPath.cgPath
shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.strokeColor = UIColor.clear.cgColor
return shapeLayer
下面是我得到的。我在 Whosebug 中尝试了一些解决方案,但对我没有用。我需要的是将该白框设置为 parent 视图的边框,即 transparent 灰色矩形:
找到解决方案,
第一个错误是我在 ViewController 的某处更改了 UIView 框架,它给我的坐标总是比我预期的错误,所以我只是在 Storyboard 中创建了 UIView 并使用了它的出口。
第二个错误是数学计算错误。
为了使 shapeLayer 适合其父视图大小,我这样做了:
bezierPath.apply(CGAffineTransform(scaleX: abs(targetFrame.bounds.size.width / bezierPath.cgPath.boundingBox.width), y: abs(targetFrame.bounds.size.height / bezierPath.cgPath.boundingBox.height)))
在我尝试划分目标框架和 bezierRect 大小但我没有使用 abs() 之前它给了我错误的结果!
我有一个贝塞尔路径形状,我需要将其设置为 parent 视图框架形状。我需要将它缩放到正确的大小,以便它可以适合自己的 parent 作为边框。 我正在使用 CAShapeLayer 将贝塞尔曲线路径添加到 parent 视图子图层,然后对其进行动画处理。
class FrameView: NSObject {
var shapeLayer: CAShapeLayer!
func frameLayer(frame targetFrame: UIView) -> CAShapeLayer {
let bezierPath = UIBezierPath()
bezierPath.move(to: CGPoint(x: 34.93, y: 0))
bezierPath.addCurve(to: CGPoint(x: 36.05, y: 0.2), controlPoint1: CGPoint(x: 34.79, y: 0), controlPoint2: CGPoint(x: 35.45, y: -0))
bezierPath.addLine(to: CGPoint(x: 36.16, y: 0.22))
bezierPath.addCurve(to: CGPoint(x: 38, y: 2.85), controlPoint1: CGPoint(x: 37.27, y: 0.63), controlPoint2: CGPoint(x: 38, y: 1.68))
bezierPath.addCurve(to: CGPoint(x: 38, y: 3), controlPoint1: CGPoint(x: 38, y: 3), controlPoint2: CGPoint(x: 38, y: 3))
// MORE CODE FOR BEZIERPATH ...
bezierPath.apply(CGAffineTransform(translationX: targetFrame.bounds.minX, y: targetFrame.bounds.minY))
bezierPath.apply(CGAffineTransform(scaleX: 2.0, y: 2.0))
self.shapeLayer = CAShapeLayer()
shapeLayer.path = bezierPath.cgPath
shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.strokeColor = UIColor.clear.cgColor
return shapeLayer
下面是我得到的。我在 Whosebug 中尝试了一些解决方案,但对我没有用。我需要的是将该白框设置为 parent 视图的边框,即 transparent 灰色矩形:
找到解决方案, 第一个错误是我在 ViewController 的某处更改了 UIView 框架,它给我的坐标总是比我预期的错误,所以我只是在 Storyboard 中创建了 UIView 并使用了它的出口。
第二个错误是数学计算错误。
为了使 shapeLayer 适合其父视图大小,我这样做了:
bezierPath.apply(CGAffineTransform(scaleX: abs(targetFrame.bounds.size.width / bezierPath.cgPath.boundingBox.width), y: abs(targetFrame.bounds.size.height / bezierPath.cgPath.boundingBox.height)))
在我尝试划分目标框架和 bezierRect 大小但我没有使用 abs() 之前它给了我错误的结果!