SwiftUI中如何便捷获取CGSize向量的模长?
简便获取DragGesture速度向量模长的方法
不需要手动编写平方根与平方运算代码,有两种更简洁的实现方案:
方案一:利用CGVector内置属性
直接将CGSize类型的速度值转换为CGVector,使用其自带的magnitude属性一键获取模长:
Circle() .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged({ tap in let velocityMagnitude = CGVector(dx: tap.velocity.width, dy: tap.velocity.height).magnitude print(velocityMagnitude) }) )
方案二:给CGSize添加扩展属性
如果需要频繁获取CGSize的模长,给CGSize写一个扩展添加计算属性,后续使用时直接调用即可,代码可读性与复用性更强:
extension CGSize { var magnitude: CGFloat { sqrt(width * width + height * height) } } // 调用示例 Circle() .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged({ tap in print(tap.velocity.magnitude) }) )
补充说明
两种方案的底层计算逻辑和你手动编写的勾股定理公式一致,但代码更简洁规范。系统CGVector.magnitude的内部实现同样基于勾股定理,性能上和手动计算无明显差异,完全可以在拖拽回调中放心使用。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

