我试图绘制一个充满黑色的圆角矩形。但相反,它里面有很多白色。问题是BezierPath(arcCenter:...)
关闭了路径,即使未调用close()
。
在第二张图片中,我删除了一个部分,以便可以看到结构。我的形状由4条线和4条小弧组成。
我设法找到了这些答案,但都没有帮助。我想他们会解决所提出的问题,但是他们都没有解释发生了什么,以及如何避免这种额外的线条。
addArc(withCenter) closing path
How can I prevent closing Bezier Path
Extra line when drawing an arc in swift
我为每个弧使用的代码都是这样的
let extent = CGFloat(startAngle) // -1.5707963267948966
let end = extent + CGFloat(arcAngle) // 0
let cx = CGFloat(x + w / 2)
let cy = CGFloat(y + h / 2)
let maxSize = CGFloat(max(w, h))
let path = MBezierPath(arcCenter: CGPoint.zero, radius: maxSize / 2, startAngle: extent, endAngle: end, clockwise: arcAngle >= 0)
var transform = CGAffineTransform(translationX: cx, y: cy)
transform = transform.rotated(by: CGFloat(rotation))
path.apply(transform.scaledBy(x: CGFloat(w) / maxSize, y: CGFloat(h) / maxSize))
bezierPath.append(path)
请求的修改
我绘制的路径采用svg格式
<path d="M 140 25 L 220 25 A 10 20 0 0 1 230 45 L 230 105 A 10 20 0 0 1 220 125 L 140 125 A 10 20 0 0 1 130 105 L 130 45 A 10 20 0 0 1 140 25 L 220 25 " fill="black" stroke="red" />
在调试器中看到的4个角的值出现顺序:
extent = -pi / 2,0,pi / 2,pi
end = 0,pi / 2,pi,3 * pi / 2
使用CGContext的drawPath方法绘制路径。它在无数其他路径上运行良好。它就像ctx!.drawPath(using: .fill)
MBezierPath
是一个typedef。 public typealias MBezierPath = UIBezierPath
抱歉。所有问题都发生在开源的Macaw库中。
我会尝试更清楚地说明问题。请参见第二张图片左下角的圆弧。弧本身是红色的,并且还以一种方式填充黑色,这表明有一条额外的线连接弧的末端。如果有真正的线条那么它也会是红色的,所以事实并非如此,但是显然有一些我不需要的东西。
我还要补充说bezierPath.addArc(withCenter:...)
没有关闭路径,一切正常。但是在这种情况下,我必须使用BezierPath(arcCenter:...)
创建一个单独的路径,因为我需要应用变换矩阵,然后才能将此弧路径添加到包含其余形状的路径。