美文网首页
iOS 14 新特性(二)- WidgetKit 桌面小组件-区

iOS 14 新特性(二)- WidgetKit 桌面小组件-区

作者: CocoaJason | 来源:发表于2020-09-26 23:23 被阅读0次

    假如某组件需要大中小三种类型展示不同的view,可参照此文章进行设置

    关键代码

    @Environment(\.widgetFamily) var family
        
        @ViewBuilder
        var body: some View {
            switch family {
            case .systemSmall:
                Text("小组件-中杯")
            case .systemMedium:
                Text("小组件-大杯")
            case .systemLarge:
                Text("小组件-特大杯")
            default:
                Text("小组件-默认给个中杯的")
            }
        }
    
    
    import WidgetKit
    import SwiftUI
    import Intents
    
    struct OneWordEntry: TimelineEntry {
        let date: Date
        let data: OneWord
    }
    
    struct OneWordProvider: IntentTimelineProvider {
        func placeholder(in context: Context) -> OneWordEntry {
            return OneWordEntry(date: Date(), data: OneWord(content: "人类的悲欢并不相通,我只觉得他们吵闹", length: 18))
        }
        
        func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (OneWordEntry) -> Void) {
            let entry = OneWordEntry(date: Date(), data: OneWord(content: "一言", length: 2))
            completion(entry)
        }
        func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
            let currentDate = Date()
            let refreshDate = Calendar.current.date(byAdding: .minute, value: 60, to: currentDate)!
            OneWorldLoader.fetch { result in
                let oneWord: OneWord
                if case .success(let fetchedData) = result {
                    oneWord = fetchedData
                } else {
                    oneWord = OneWord(content: "很遗憾本次更新失败,等待下一次更新.", length: 18)
                }
                let entry = OneWordEntry(date: currentDate,data: oneWord)
                let timeline = Timeline(entries: [entry], policy: .after(refreshDate))
                completion(timeline)
            }
        }
    }
    
    struct widgetEntryView : View {
        var entry: OneWordProvider.Entry
        
        @Environment(\.widgetFamily) var family
        
        @ViewBuilder
        var body: some View {
            switch family {
            case .systemSmall:
                Text("小组件-中杯")
            case .systemMedium:
                Text("小组件-大杯")
            case .systemLarge:
                Text("小组件-特大杯")
            default:
                Text("小组件-默认给个中杯的")
            }
        }
        
    }
    
    @main
    struct widget: Widget {
        let kind: String = "widget"
        
        var body: some WidgetConfiguration {
            IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: OneWordProvider()) { entry in
                widgetEntryView(entry: entry)
            }
            .configurationDisplayName("My Widget")
            .description("This is an example widget.")
            .supportedFamilies([.systemSmall,.systemMedium,
                                .systemLarge
            ])
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS 14 新特性(二)- WidgetKit 桌面小组件-区

          本文链接:https://www.haomeiwen.com/subject/slzhuktx.html