You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:12:03