0
1

More than 1 year has passed since last update.

[SwiftUI / WidgetKit]大きさが異なるウィジェットを設定する

Posted at

この記事の内容

  • 大きさが異なるウィジェットを設定する

開発環境

項目 内容
PC MacBook Air (2020 M1)
言語 Swift
フレームワーク SwiftUI
IDE Xcode
コード管理 GitHub

コード

EmojisWidget.swift
import WidgetKit
import SwiftUI

struct Provider: TimelineProvider {
    
    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
        let entry = SimpleEntry(date: Date(), emoji: Emoji(icon: "💛", name: "N/A", description: "N/A"))
        completion(entry)
    }
    
    func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
        let userDefaults = UserDefaults(suiteName: "group.sample.Emojis")!
        let date = Date()
        let emojiData = userDefaults.object(forKey: "Emoji") ?? Data()
        guard let emoji = try? JSONDecoder().decode(Emoji.self,from: emojiData as! Data) else {
            let entry = SimpleEntry(date: date, emoji: Emoji(icon: "💛", name: "N/A", description: "N/A"))
            let timeline = Timeline(entries: [entry], policy: .never)
            completion(timeline)
            return
        }
        let entry = SimpleEntry(date: date, emoji: emoji)
        let timeline = Timeline(entries: [entry], policy: .never)
        completion(timeline)
    }
    
    func placeholder(in context: Context) -> SimpleEntry {
        return SimpleEntry(date: Date(), emoji: Emoji(icon: "💛", name: "N/A", description: "N/A"))
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
    let emoji: Emoji
}

struct EmojisWidgetEntryView : View {
    @Environment(\.widgetFamily) var family: WidgetFamily
    
    var entry: Provider.Entry

    var body: some View {
        switch family {
        case .systemSmall:
            EmojisWidgetSmallView(emoji: entry.emoji)
        case .systemMedium:
            EmojisWidgetMediumView(emoji: entry.emoji)
        case .systemLarge:
            EmojisWidgetLargeView(emoji: entry.emoji)
        case .systemExtraLarge:
            EmojisWidgetLargeView(emoji: entry.emoji)
        }
            
    }
}

struct EmojisWidgetSmallView : View {
    var emoji: Emoji
    var body: some View {
        EmojiView(emoji: emoji)
    }
}

struct EmojisWidgetMediumView : View {
    var emoji: Emoji
    var body: some View {
        HStack {
            EmojiView(emoji: emoji)
            Text(emoji.name)
        }
    }
}

struct EmojisWidgetLargeView : View {
    var emoji: Emoji
    var body: some View {
        HStack {
            EmojiView(emoji: emoji)
            VStack(alignment: .leading){
                Text(emoji.name)
                Text(emoji.description)
            }
        }
    }
}

@main
struct EmojisWidget: Widget {
    let kind: String = "EmojisWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "Emojis_Widget", provider: Provider()) { entry in
            EmojisWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("Emojis Widget")
        .description("This is an example widget.")
        .supportedFamilies([.systemSmall,.systemMedium,.systemLarge,.systemExtraLarge])
    }
}

struct EmojisWidget_Previews: PreviewProvider {
    static var previews: some View {
        EmojisWidgetEntryView(entry: SimpleEntry(date: Date(), emoji: Emoji(icon: "💛", name: "N/A", description: "N/A")))
            .previewContext(WidgetPreviewContext(family: .systemSmall))
    }
}

GitHub のコード

注意事項

ウィジェットのうち .systemExtraLarge は iPad のみで利用可能

備考

  • 上記スクリーンショットは、iPad (9th Generation) のもの

参考資料

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1