是否存在相当于 CGPath 的 `addArc(tangent1End:tangent2End:radius:transform:)` 的 UIBezierPath ?

Posted

技术标签:

【中文标题】是否存在相当于 CGPath 的 `addArc(tangent1End:tangent2End:radius:transform:)` 的 UIBezierPath ?【英文标题】:Is there a UIBezierPath equivalent of CGPath's `addArc(tangent1End:tangent2End:radius:transform:)`? 【发布时间】:2021-02-26 01:47:13 【问题描述】:

构建圆角矩形的自定义变体是一项繁琐的工作。此线程中的 Swift V 5.1 答案:

Swift: UIBezierPath Stroke Animation from Center

描述了从顶部中心开始绘制一个圆角矩形,因此您可以从该点开始绘制动画。

它使用 UIBezierPath 方法addArc(withCenter:radius:startAngle:endAngle:clockwise:) 绘制圆角矩形的角弧。

正确使用代码绘制连接的线段和四分之一圆弧需要非常小心,还需要一些三角学知识来计算每个象限的不同圆弧的角度。

CGPath 在 addArc 上有一个变体,addArc(tangent1End:tangent2End:radius:transform:),它的工作方式不同。它采用“切线端点”点来定义弧线,设置起来不那么繁琐(一旦你弄清楚它是如何工作的)。

我找不到 UIBezierPath 的等效方法。我错过了什么吗?我想答案是创建一个CGPath(或者更确切地说,CGMutablePath 使用对addArc(tangent1End:tangent2End:radius:transform:) 的调用,然后使用采用CGPath 的UIBezierPath 初始化程序,但这是一个使代码更加混乱的附加步骤.

【问题讨论】:

我认为如果您使用形状而不是使用CAShapeLayer 或使用文本而不是使用CATextLayer 它可能会对您有所帮助:) 【参考方案1】:

似乎没有与CGPath 方法addArc(tangent1End:tangent2End:radius:transform:) 等效的UIBezierPath

我想答案是当你想以addArc(tangent1End:tangent2End:radius:transform:) 的形式添加弧时只使用CGPath,然后使用UIBezierPath.init(cgPath:) 初始化器将结果转换为UIBezierPath

起初我想我可以写一个UIBezierPath 的扩展,将addArc(tangent1End:tangent2End:radius:transform:) 方法添加到UIBezierPath,但这会变得非常混乱,因为addArc(tangent1End:tangent2End:radius:transform:) 使用当前笔在活动路径中的位置找出第一条切线。

【讨论】:

“使用当前笔位”是指currentPointdeveloper.apple.com/documentation/uikit/uibezierpath/…吗? 是的。看起来UIBezierPathCGPath 都公开了一个读写currentPoint 属性,因此可以从贝塞尔路径读取当前点,并在使用CGPath addArc(tangent1End:tangent2End:radius:transform:) 构建弧的扩展中使用它

以上是关于是否存在相当于 CGPath 的 `addArc(tangent1End:tangent2End:radius:transform:)` 的 UIBezierPath ?的主要内容,如果未能解决你的问题,请参考以下文章

CGPath 绘制一个加载器

在不从 CGPath 开头开始的情况下跟随带有 SKAction 的 CGPath

ios:如何使用 CGPath 模糊图像?

调整 UIView 的大小以适应 CGPath

查找 CGPath 的方向/缠绕方向

如何创建一个随机封闭平滑CGPath?