在我的 SwiftUI iOS 17 应用程序中,我在 ActivityWidget 中显示一个计时器,以便用户在手机屏幕锁定时可以看到倒计时器。
为了显示小部件,我仅将结束日期传递给活动小部件并使用文本日期样式来显示计时器倒计时:
import ActivityKit
import WidgetKit
import SwiftUI
struct TimerAttributes: ActivityAttributes {
let endDate: Date
public struct ContentState: Codable, Hashable {
}
}
struct TimerWidgetLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: TimerAttributes.self) { context in
Text(context.attributes.endDate, style: .timer)
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedRegion(.leading) {
}
DynamicIslandExpandedRegion(.center) {
}
DynamicIslandExpandedRegion(.trailing) {
}
DynamicIslandExpandedRegion(.bottom) {
}
} compactLeading: {
} compactTrailing: {
} minimal: {
}
}
}
}
我遇到的问题是文本格式不一致。我希望它显示为 03:32:44。
刚锁屏时确实是这样显示的。但当新 iPhone 的屏幕进入常亮状态时,它会显示“3 小时 32 分钟”。
我理解减少秒数以节省电池,但我想要 3:32:-- 这就是本机计时器应用程序的作用。有没有办法改变这种格式?
我尝试过启动计时器并每秒更新一次,但这似乎也使用了太多电池,而且我更喜欢当它进入始终开启状态时减少几秒,它似乎使用文本样式管理得很好。
只是想知道最好的方法是什么,如果只是睡眠并且计时器用 -- 替换秒,在始终打开的状态下显示计时器,而不是写出“小时和分钟”,这会占用太多空间并破坏有限的 UI。
花了一些时间在这上面,找到了如何在锁定屏幕上获取 XX:-- 格式并使用 始终显示。
技巧是不要将
Text
初始化器与Date
一起使用,而是将其与timerInterval
一起使用。
参见下面的示例:
Text(
timerInterval: Date.now...Date(timeInterval: 3600, since: .now),
countsDown: false
)
此示例会在屏幕解锁时从 0 计时到 1 小时,并在屏幕锁定时切换到 0:--。 (您可能会使用
context
对象中的日期)。如果您想倒计时,只需翻转 countsDown
值即可。
我相信这就是 Apple 在其计时器应用程序实时活动中使用的方法。
希望这有帮助!