如何调整Measurement单位后缀自动切换的触发阈值
是否可以调整系统内置的单位切换阈值?
不能。苹果的Foundation框架中没有公开任何API允许自定义Measurement格式化时的单位切换阈值,该阈值是系统根据你指定的usage参数、当前区域的测量单位体系内置预设的,无法直接修改。
自定义切换阈值的实现方案
你可以手动判断测量值的大小,主动将其转换为你需要的单位后再调用系统格式化方法,就能完全自主控制切换逻辑,示例代码如下:
// 针对长度单位的自定义格式化扩展,可自定义切换阈值 extension Measurement where UnitType == UnitLength { func roadFormatted(kilometerThreshold: Double = 1000, mileThreshold: Double = 0.5) -> String { let usesImperial = Locale.current.measurementSystem == .imperial if usesImperial { let mileValue = converted(to: .miles).value return mileValue >= mileThreshold ? converted(to: .miles).formatted(.measurement(width: .abbreviated, usage: .road)) : converted(to: .feet).formatted(.measurement(width: .abbreviated, usage: .road)) } else { return value >= kilometerThreshold ? converted(to: .kilometers).formatted(.measurement(width: .abbreviated, usage: .road)) : converted(to: .meters).formatted(.measurement(width: .abbreviated, usage: .road)) } } } // 调用示例 struct ContentView: View { var body: some View { VStack { // 调整阈值为1公里才切换,999米时仍显示米 Text(Measurement(value: 999, unit: UnitLength.meters) .roadFormatted(kilometerThreshold: 1000) ) // 调整阈值为1英里才切换,0.99英里时仍显示英尺 Text(Measurement(value: 0.99, unit: UnitLength.miles) .roadFormatted(mileThreshold: 1) ) } } }
你原测试代码的运行效果如下:
内容的提问来源于stack exchange,提问作者Yotzin Castrejon
相关产品推荐
相关产品推荐

