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

SwiftUI与WidgetKit:实现AM/PM整体换行显示

解决WidgetKit中时间文本换行问题

要实现12小时制下AM/PM整体换行、24小时制不显示的效果,核心是拆分时间与AM/PM的布局,同时根据系统时区自动适配格式,具体步骤如下:

1. 自定义日期格式化逻辑

不再依赖系统的.short时间样式,而是根据当前设备的Locale判断是12小时制还是24小时制,生成对应的格式化字符串:

static func getSleepTimeFormat() -> DateFormatter {
    let formatter = DateFormatter()
    formatter.dateStyle = .none
    
    // 判断当前Locale是否使用12小时制
    let is12HourFormat = DateFormatter.is12HourFormat(for: Locale.current)
    formatter.dateFormat = is12HourFormat ? "h:mm" : "HH:mm"
    
    return formatter
}

// 单独获取AM/PM标识
static func getAmPmString(for date: Date) -> String? {
    guard DateFormatter.is12HourFormat(for: Locale.current) else {
        return nil // 24小时制下返回nil,不显示
    }
    let formatter = DateFormatter()
    formatter.dateFormat = "a"
    return formatter.string(from: date)
}

2. 用VStack实现换行布局

将时间文本和AM/PM文本分开,通过垂直栈布局让AM/PM整体显示在下方,24小时制下自动隐藏AM/PM部分:

VStack(alignment: .leading, spacing: 2) {
    Text("\(targetBedTime, formatter: Self.getSleepTimeFormat())")
        .font(.system(size: 14))
        .fontWeight(.bold)
    
    if let amPm = Self.getAmPmString(for: targetBedTime) {
        Text(amPm)
            .font(.system(size: 10))
            .fontWeight(.bold)
    }
}

关键说明

  • 通过DateFormatter.is12HourFormat(for:)方法准确判断当前系统的时间制式,无需手动适配不同地区
  • 拆分时间与AM/PM后,布局完全可控,避免系统自动拆分AM/PM字符
  • 24小时制下通过可选值判断,自动隐藏AM/PM文本,符合系统显示逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:15:08