在Objective-C项目中如何将SVG路径d值转为UIBezierPath?
把SVG的d路径字符串转成UIBezierPath的方法
嘿,这个需求我太熟了!不用自己费劲去解析SVG里那些M、c之类的路径指令,iOS其实有现成的方法能直接把SVG的d字符串转成UIBezierPath,省超多时间~
一、iOS 13+ 原生解决方案(最简单)
从iOS13开始,UIBezierPath直接提供了通过SVG路径字符串初始化的方法,你只需要把你的SVG d值传进去就行,代码示例如下:
// 替换成你完整的SVG d路径字符串 NSString *svgDString = @"M418.3,70c-0.2-4.3-1.1-8.4-2.4-12.2c-0.3,0.1-12.3,4.9-52.7,4.9c-40.8,0-51.5-4.9-51.5-4.9c-0.9,2.1-1.5,4.1-1.9,5.7c-1.9,8.3-2.8,23.5-2.5,28.2s1..."; // 直接生成UIBezierPath UIBezierPath *mybezierPath = [UIBezierPath bezierPathWithSVGString:svgDString]; // 接下来就是你原来的CAShapeLayer逻辑,完全不用改 CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; shapeLayer.path = mybezierPath.CGPath; // 可以按需设置样式,比如线条颜色、宽度、填充色 shapeLayer.strokeColor = [UIColor blackColor].CGColor; shapeLayer.fillColor = [UIColor clearColor].CGColor; shapeLayer.lineWidth = 1.0; [[self.view layer] addSublayer:shapeLayer];
二、注意:坐标系适配问题
SVG的坐标系和UIKit的坐标系是相反的——SVG的Y轴是向下的,而UIKit的Y轴是向上的,所以直接转出来的路径可能会上下颠倒。你可以通过给UIBezierPath应用变换来修正:
// 先翻转Y轴 CGAffineTransform flipTransform = CGAffineTransformMakeScale(1, -1); [mybezierPath applyTransform:flipTransform]; // 再平移到视图的正确位置(比如视图底部,抵消翻转后的偏移) CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, self.view.bounds.size.height); [mybezierPath applyTransform:translateTransform];
三、iOS 13以下版本的兼容方案
如果你的项目需要支持iOS13之前的系统,原生没有这个方法,有两个选择:
- 手动解析SVG指令:自己写代码解析M(移动到)、c(三次贝塞尔曲线)、l(直线)等指令,逐个构建UIBezierPath的路径节点,但这个工作量大,容易出错。
- 使用第三方库:比如
SVGKit,它能很好地解析SVG路径,而且支持低版本系统,你可以用它把SVG d字符串转成UIBezierPath。
内容的提问来源于stack exchange,提问作者doxsi
相关产品推荐
相关产品推荐

