Визуализация изображений в виджетах iOS 14

#swift #swiftui #widget #ios14 #widgetkit

#swift #swiftui #виджет #ios14 #widgetkit

Вопрос:

Я разрабатываю расширение виджета iOS 14.

У меня есть 3 изображения для отображения в цикле и создания временной шкалы для отображения этих изображений.

 func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    var entries: [ImageEntry] = []
    let currentDate = Date()
    
    for i in 1 ..< 4 {
        let imageNumber = String(i)
        let currentImage = "image_"   imageNumber
        let entry = ImageEntry(date: currentDate,image: currentImage)
        entries.append(entry)
    }

    let nextUpdateDate = Calendar.current.date(byAdding: .minute, value: 5, to: currentDate)!
    let timeline = Timeline(entries: entries, policy: .after(nextUpdateDate))

    completion(timeline)
}


struct WidgetModuleEntryView : View {
var entry: Provider.Entry

var body: some View {
    Image(entry.image)
        .resizable()
        .scaledToFill()
    }
}
  

Первое изображение всегда отображается, а последующие — нет.

В чем может быть проблема?

Ответ №1:

Настройка временной шкалы для каждой записи необходимо указать явную дату ввода. Параметр политики предназначен для воссоздания следующей временной шкалы.

Итак, ваш getTimeline должен выглядеть так

 func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    var entries: [ImageEntry] = []
    let currentDate = Date()

    for i in 1 ..< 4 {
        let imageNumber = String(i)
        let currentImage = "image_"   imageNumber
        let entryDate = Calendar.current.date(byAdding: .minute, value: (i-1)*5, to: currentDate)!
        let entry = ImageEntry(date: entryDate, image: currentImage)
        entries.append(entry)
    }

    let timeline = Timeline(entries: entries, policy: .atEnd)
    completion(timeline)
}
  

Комментарии:

1. Нет рендеринга содержимого. Может ли проблема быть связана с EntryView ? struct WidgetModuleEntryView : View { var entry: Provider.Entry var body: some View { Image(entry.image) .resizable() .scaledToFill() }}

2. Я пропустил, что ваш диапазон начинается с 1, поэтому первое изображение будет показано через 5 минут. См. Исправлено.

3. По-прежнему нет рендеринга контента.

4. Я воспроизвел этот сценарий локально — все работает нормально (просто использовал .second для более быстрой итерации). Xcode 12GM / iOS 14.

5. Изображения не были должным образом добавлены в проект. Теперь это работает. Спасибо, что уделили мне время.