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