Анимация часов iOS на виджете на главном экране

Я хочу добавить в свое приложение виджет домашнего экрана, как и в приложении «Часы» в системе iOS, секундная стрелка движется каждую секунду. Долго искал в Google и Github и не нашел подходящего решения. Я видел, что уже есть сторонние приложения, которые могут реализовать такие виджеты рабочего стола. Например: https://apps.apple.com/us/app/id1525347157.

Как они это делают?


person mars    schedule 18.02.2021    source источник
comment
Вы не можете обновлять значок динамически. Только яблоко может это сделать. У вас должна быть возможность создавать виджет и отправлять большой набор записей временной шкалы, которые меняются каждую секунду.   -  person Paulw11    schedule 18.02.2021
comment
Но это приложение apps.apple.com/us/app/id1525347157 может отображать анимацию часов. в виджете на главном экране ...   -  person mars    schedule 18.02.2021


Ответы (3)


У Apple есть целая страница о том, как отображать динамические Dates.

В WWDC20 пример кода виджетов вместе обновляется каждую секунду. Их временная шкала выходит каждую минуту.

Используя текстовое представление в виджете, вы можете отображать актуальные даты и время на экране. В следующих примерах показаны доступные комбинации. Чтобы отобразить относительное время, которое обновляется автоматически:

let components = DateComponents(minute: 11, second: 14)
let futureDate = Calendar.current.date(byAdding: components, to: Date())!

Text(futureDate, style: .relative)
// Displays:
// 11 min, 14 sec

Text(futureDate, style: .offset)
// Displays:
// -11 minutes

Для дат в будущем стиль таймера ведет обратный отсчет до тех пор, пока текущее время не достигнет указанной даты и времени, и ведет отсчет по истечении указанной даты. Чтобы отобразить абсолютную дату или время:

// Absolute Date or Time
let components = DateComponents(year: 2020, month: 4, day: 1, hour: 9, minute: 41)
let aprilFirstDate = Calendar.current(components)!

Text(aprilFirstDate, style: .date)
Text("Date: \(aprilFirstDate, style: .date)")
Text("Time: \(aprilFirstDate, style: .time)")
person lorem ipsum    schedule 18.02.2021
comment
Спасибо за ваш ответ. Но я хочу показать анимацию часов, что секундная стрелка движется каждую секунду. Любой способ реализовать это? - person mars; 18.02.2021

Согласно Apple, это невозможно.

Здесь вы можете найти комментарий системного инженера Apple:

[...] Однако вы не можете обновлять представления на время, отличное от текстовой метки относительной даты. Таким образом, вы не можете воспроизвести виджет часов, например, и удерживать секундные стрелки на тиканье часов, пока виджет виден. Извините.

Кроме того, из Руководства по человеческому интерфейсу для виджетов :

Своевременно обновляйте виджет. Чтобы виджет оставался актуальным и полезным, его информацию следует периодически обновлять. Виджеты не поддерживают непрерывные обновления в реальном времени, и система может регулировать лимиты обновлений в зависимости от различных факторов.

Насколько я понимаю, для сторонних приложений единственный способ предоставить такую ​​анимацию - это использовать частный API. В конце концов, виджет системных часов делает это, поэтому на самом деле можно было бы воспроизвести это поведение с помощью некоторых частных методов, о которых я не знаю.

Если вам интересно изучить еще несколько темных уголков SwiftUI, этот пост может помочь вам начать:

person pawello2222    schedule 28.02.2021

Идея состоит в том, чтобы просто WidgetCenter.shared.reloadAllTimelines() спамить каждый тик. Проверьте это репо: https://github.com/lexrus/LexClockWidget

person Den Andreychuk    schedule 30.03.2021
comment
Я пробовал этот проект, он больше не работает - person mars; 09.06.2021