iOS 14 Text,带有天数计时器

问题描述

我正在iOS 14中构建一个小部件,以倒计时直到发生事件为止的时间。我希望计时器具有天,小时,分钟和秒。到目前为止,我发现Text(someFutureDate,style: .timer)的工作原理(几乎)完美。唯一的缺点是它只占hours:minutes:seconds

当前,我的应用程序中的下一个事件距离现在有79天,因此显示1915小时并不是最用户友好的操作。有人可以巧妙地显示days:hours:minutes:seconds吗?

解决方法

以下代码在文本中为您提供“ 2天3个小时”。

let components = DateComponents(day: 2,hour: 3,minute: 4,second: 5)
let futureDate = Calendar.current.date(byAdding: components,to: Date())!
Text(futureDate,style: .relative)

文本一次仅显示两个日期部分。如果天数降为零,则标签更改为“ X小时,Y分钟”,一旦小时数降为零,则标签更改为“ X分钟,Y秒”。Apple处理文本标签中的时间格式,因此您除了样式(.relative / .offset / .timer)之外,无法修改格式。

,

有一个视图,您可以像这样附加天数和计时器

struct ContentView: View {
    let days: String
    var body: some View {
        HStack { 
          Text(days)
          Text(":")
          Text(Date(),style: .timer)
        }
    }
}

您可以使用TimelineProvider并使小部件在每个午夜更新

func getTimeline(in context: Context,completion: @escaping (Timeline<Entry>) -> ()) {
       let dayremaining = 10 // your day from main app
       let midnight = Calendar(identifier: .gregorian).startOfDay(for: Date())
       let timeline = Timeline(entries: [ContentView(days:dayremaining)],policy: .after(midnight))

    }