是否存在相当于 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/…吗? 是的。看起来UIBezierPath
和CGPath
都公开了一个读写currentPoint
属性,因此可以从贝塞尔路径读取当前点,并在使用CGPath addArc(tangent1End:tangent2End:radius:transform:)
构建弧的扩展中使用它以上是关于是否存在相当于 CGPath 的 `addArc(tangent1End:tangent2End:radius:transform:)` 的 UIBezierPath ?的主要内容,如果未能解决你的问题,请参考以下文章