UIBezierPath-Query
为 UIBezierPath
和 NSBezierPath
添加多个酷炫功能的扩展。
完全基于 Maximilian Kraus 编写的 UIBezierPath+Superpowers,以便使其能够在 CocoaPods 中使用。
所有原始工作由其原始作者完成
需求
在 XCode 11.2.1 和 Swift 5.1 上进行测试。
Xcode 11.2+
Swift 5.1+
安装
UIBezierPath-Query 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中即可:
pod 'UIBezierPath-Query'
示例
要运行示例项目,请首先克隆仓库,然后从 Example 目录运行 pod install
。
特性
此库为 UIBezierPath
添加了多个主要特性。
计算路径长度
var mx_length: CGFloat
返回路径的长度。
计算贝塞尔点
mx_point(atFractionOfLength: CGFloat) -> CGPoint
对于给定的分数,返回路径上的点 fraction * pathLength
。
计算垂直点及距离
mx_perpendicularPoint(for: CGPoint) -> CGPoint
返回路径上与给定 CGPoint
最近点,实际上是在路径上从 point
垂直下落并返回交点。
计算路径斜率和切线角度
mx_tangentAngle(atFractionOfLength: CGFloat) -> CGFloat
对于给定的分数,返回路径上 fraction * length
点的切线角度。
工作原理
所有这一切的基础是 CGPath
上的一个函数 apply(info:, function:)
。这基本上允许你迭代一个给定的 UIBezierPath
是由什么元素组成的。
简短插曲
UIBezierPath
及其 Cocoa 平台的对应类型 NSBezierPath
是贝塞尔曲线的描述。这些曲线基本上是一种将线绘制指令输入到计算机中的巧妙方法。贝塞尔路径由不同类型的路径元素组成。每个元素要么是一条直线,要么是一条二次曲线或三次曲线。从本质上讲,这些曲线归结为数学函数,使我们能够计算诸如线条长度、切线角度等内容。如果您想了解更多信息,Wikipedia 上有一篇撰写得非常好且易于理解的关于 贝塞尔曲线 的文章。
这个库的功能是从构成路径的所有元素中提取出来并施加一些几何数学运算。由于提取和初始计算相当昂贵,如果可能的话,结果会被内部缓存。
然而,默认情况下,缓存是禁用的,因为按照设计,这个库位于一个 extension
中,而不是 UIBezierPath
的子类。这带来了关于方法覆盖、内部变量等方面的某些限制。为了启用全部功能,您需要调用 UIBezierPath.mx_prepare()
。这会执行一些背后的运行时魔法,打破了 extension
的链条,并为您提供对任何 UIBezierPath
对象上所有功能的完全访问。
贡献
随时可以根据该项目进行构建和/或提交 PR。
作者
- Maximilian Kraus
许可
本项目的许可协议为 MIT 许可证 - 有关详情,请参阅 LICENSE.md 文件。