SwiftUI 和 WidgetKit:让 AM 和 PM 换行到第二行

SwiftUI and WidgetKit: Getting AM and PM to wrap to a second line

提问人:GarySabo 提问时间:9/26/2023 最后编辑:arseniusGarySabo 更新时间:9/27/2023 访问量:46

问:

在手表上的 WidgetKit 中工作时,我无法弄清楚如何设置此文本的样式以使其看起来正确。问题在于,在 Am/PM 时间样式合适的位置,系统仅将 M 换行到下一行,我希望 AM 和 PM 都换行到第二行。在他们使用 24 小时制的地方,不应该有上午 和 下午。我怎样才能做到这一点?

static let sleepTimeFormat: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .none
        formatter.timeStyle = .short
        return formatter
    }()

    Text("\(targetBedTime, formatter: Self.sleepTimeFormat)")
        .font(.system(size: 14))
        .fontWeight(.bold)

enter image description here

SwiftUI WatchOS WidgetKit Apple-Watch 复杂功能

评论


答:

1赞 arsenius 9/27/2023 #1

您可以使用加号将空格替换为换行符来完成这项工作。ViewThatFits

let timeString = Self.sleepTimeFormat.string(from: .now)
ViewThatFits {
    Text(timeString).lineLimit(1)
    Text(timeString.replaceCharacters(from: .whitespaces, with: "\n")) // The formatter doesn't use a regular " "
}
.font(.system(size: 14))
.fontWeight(.bold)
.frame(width: 50) // Ensure second option gets displayed

// Convenience method 
extension String {
    func replaceCharacters(from characterSet: CharacterSet, with replacementString: String = "") -> String {
        self.components(separatedBy: characterSet).joined(separator: replacementString)
    }
}

结果:

Broken across two lines