iOS 14 Текст () с таймером на несколько дней

#text #timer #swiftui #widget #ios14

#текст #таймер #swiftui #виджет #ios14

Вопрос:

Я создаю виджет в iOS 14 для обратного отсчета дней до события. Я хочу, чтобы в таймере были дни, часы, минуты и секунды. До сих пор я обнаружил, что Text(someFutureDate, style: .timer) работает (почти) отлично. Единственным недостатком является то, что он имеет значение только hours:minutes:seconds .

В настоящее время до следующего события в моем приложении осталось 79 дней, поэтому отображение 1915 часов — не самая удобная для пользователя вещь. У кого-нибудь есть хитрый трюк с отображением days:hours:minutes:seconds ?

Ответ №1:

Следующий код дает вам «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 обрабатывает формат времени в текстовой метке, поэтому вы не можете изменить форматирование, кроме стиля (.относительный /.смещение /.таймер).

Ответ №2:

посмотрите, можно ли добавлять дни и таймер, например

 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))

    }