如何为RangeSeekSlider配置自定义NumberFormatter实现英尺英寸格式显示
解决RangeSeekSlider使用自定义HeightFormatter格式化thumb标签的问题
嗨,这事儿其实挺简单的,RangeSeekSlider已经给我们预留了numberFormatter属性,直接把你写的HeightFormatter实例赋值给它就行!不过得先把你的Formatter逻辑优化下,不然处理英尺数值的时候会出问题,我一步步给你说:
1. 优化自定义HeightFormatter
你原来的Formatter用了int32Value,如果遇到像6.08333这样的英尺数值,会直接取整成6,导致计算错误。我们改成用doubleValue来处理,同时支持英寸和英尺两种输入场景:
class HeightFormatter: NumberFormatter { // 新增属性标记输入单位,默认是英寸(对应你的滑块设置) var inputUnitIsFeet = false override func string(from number: NSNumber) -> String? { let value = number.doubleValue let totalInches: Int if inputUnitIsFeet { // 英尺转英寸,四舍五入避免小数误差 totalInches = Int(round(value * 12)) } else { // 英寸直接取整 totalInches = Int(round(value)) } let feet = totalInches / 12 let inches = totalInches % 12 // 按照你要的格式返回,注意转义双引号 return "\(feet)'\(inches)''" } }
2. 给RangeSeekSlider绑定自定义Formatter
在你初始化或者配置RangeSeekSlider的地方,创建HeightFormatter实例,赋值给它的numberFormatter属性就搞定了:
// 假设你的RangeSeekSlider实例叫rangeSeekSlider let heightFormatter = HeightFormatter() // 因为你的滑块设置的是英寸单位,所以保持inputUnitIsFeet默认false即可 rangeSeekSlider.numberFormatter = heightFormatter // 如果之后需要处理英尺数值的格式化,只需要设置inputUnitIsFeet为true: // heightFormatter.inputUnitIsFeet = true // let formattedString = heightFormatter.string(from: 6.08333 as NSNumber) // 会得到"6'1''"
这样一来,RangeSeekSlider在显示thumb标签的时候,就会自动调用你的HeightFormatter的string(from:)方法,把滑块的英寸数值转换成你想要的英尺英寸格式啦!
内容的提问来源于stack exchange,提问作者caa5042
相关产品推荐
相关产品推荐

