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

SwiftUI如何避免VStack中Text横向偏移,实现iOS相机时间标签布局?

问题原因

出现横向偏移的核心原因是系统默认字体的数字宽度不统一,比如数字「1」的宽度比「0」更窄,时间更新时Text视图的宽度会随数字变化发生变动,进而产生偏移。

解决方案

使用系统提供的等宽数字修饰符即可实现和iOS相机完全一致的效果,该修饰符只会让数字字符保持等宽,不会影响其他字符的显示效果,是最优解。同时需要修正原代码的时间格式化逻辑,避免秒数超过9后显示格式异常。

修改后完整代码如下:

class TimeTestModel:ObservableObject {
    
    @Published var seconds:Int = 0
    
    var timer:Timer?
    
    init() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(TimeTestModel.tick), userInfo: nil, repeats: true)
    }
    
    @objc func tick() {
        seconds += 1
    }
    
}


struct TestView: View {
    
    @StateObject var timeModel = TimeTestModel()
    
    var body: some View {
        
        VStack() {
            HStack {
                // 格式化时间为两位分:两位秒,添加等宽数字修饰符
                Text(String(format: "%02d:%02d", 0, timeModel.seconds))
                    .monospacedDigit()
                    // 如需自定义字体大小、权重可以使用如下写法
                    // .font(.system(size: 14, weight: .semibold).monospacedDigit())
            }
            .border(.red)
        }

    }
}

如果需要额外固定标签整体宽度,可以叠加frame约束,适配更复杂的布局场景:

Text(String(format: "%02d:%02d", 0, timeModel.seconds))
    .monospacedDigit()
    .frame(minWidth: 60, alignment: .leading)

内容的提问来源于stack exchange,提问作者zumzum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:04