Entwicklung von iOS16-Sperrbildschirm-Widgets

Vorwort

Die Lösung des Problems, wie ein Sperrbildschirm-Widget hinzugefügt wird, ist eigentlich sehr einfach. Es müssen drei WidgetFamily- Typen hinzugefügt werden, um das Sperrbildschirm-Widget auf der Grundlage des Desktop-Widgets zu unterstützen. Wir müssen nur die WidgetFamily und die Ansicht unterstützen.

veranschaulichen

iOS16 hat die Bearbeitungsfunktion des Sperrbildschirms hinzugefügt. Es gibt zwei Bereiche, in denen Widgets platziert werden können. WidgetFamily fügt außerdem drei Typen hinzu : „accessoireInline“ , „accessoireRectangular “ und „accessoireCircular “. Die entsprechende Beziehung ist in der folgenden Abbildung dargestellt:Beschreibung 1

一、accessoryInline

Das Widget vom Typ „accessoryInline“ kann nur im oberen Widgetbereich platziert werden und es kann nur eine Bild- und Textzeile mit fester Länge platziert werden. Es muss eine auf der linken Seite vorhanden seinSystemdatum
Beschreibung 2

二、accessoryRectangular、accessoryCircular

„accessoireRectangular“ und „accessoireCircular“ können nur im == unteren Widget-Bereich (1x4) == Anordnung und Kombination platziert werden.
Die rechteckige Form des Zubehörs ist ein abgerundetes Rechteck, der Inhalt ist ein Rechteck.Besetzen Sie 1x2Setzen Sie also höchstens 2. Zwischen oben, unten, links und rechts gibt es einen gewissen Abstand, der nicht ausgefüllt ist.
ZubehörKreisform ist ein abgerundetes Quadrat, der Inhalt ist ein Kreis,占位1x1所以最多放置4个。上下左右是有一定的边距的,并不是填满。Beschreibung 3

限制

  1. 刷新机制依旧延续桌面小组件的刷新机制。
  2. 文字和图片的颜色设置无效,在锁屏小组件上都会被渲染成系统时间一样的颜色,但是颜色设置会导致颜色的深浅不一样。
  3. accessoryInline 只能显示ImageTextaccessoryRectangular、accessoryCircular 还能显示一些ProgressView
  4. 尺寸非常小,且位置固定,展示内容有限。
  5. 无法像桌面小组件一样长按打开后面的编辑页面用SiriIntent 提供用户配置,自由度较小。

代码

只需要在Widget入口的supportedFamilies属性中支持即可

@main
struct MyWidget: Widget {
    
    
    let kind: String = "MyTWidget"

    var body: some WidgetConfiguration {
    
    
        StaticConfiguration(kind: kind, provider: Provider()) {
    
     entry in
            WidgetEntryView(entry: entry)
        }
        .configurationDisplayName("xxx")
        .description("xxx")
        // 在这里支持小组件类型
        .supportedFamilies([.accessoryInline, .accessoryRectangular, .accessoryCircular])
    }
}

视图则可以使用 @Environment(.widgetFamily) var family 来区分尺寸,编写不同的视图。

struct WidgetEntryView : View {
    
    
    var entry: Provider.Entry
    @Environment(\.widgetFamily) var family // 尺寸环境变量
    var body: some View {
    
    
        switch family{
    
    
        case .accessoryInline :
            Text("顶部文字")
        case .accessoryCircular :
            Text("1x1组件")
        case .accessoryRectangular :
            Text("1x2组件")
        default :
            Text("默认")
        }
    }
}

如果你的项目目标系统是iOS14Widget还要支持iOS14 的桌面小组件,可以使用版本判断来区分supportedFamilies

func getWidgetSupportedFamilies () -> [WidgetFamily]{
    
    
    if #available(iOS 16, *) {
    
    
        return [.accessoryInline, .accessoryRectangular, .accessoryCircular, .systemSmall]
    } else {
    
    
        return [.systemSmall]
    }
}

@main
struct MyWidget: Widget {
    
    
    let kind: String = "MyTWidget"

    var body: some WidgetConfiguration {
    
    
        StaticConfiguration(kind: kind, provider: Provider()) {
    
     entry in
            WidgetEntryView(entry: entry)
        }
        .configurationDisplayName("xxx")
        .description("xxx")
        // 在这里支持小组件类型
        .supportedFamilies(getWidgetSupportedFamilies())
    }
}

如果需要像闹钟那样的毛玻璃背景的话可以使用 AccessoryWidgetBackground()Beschreibung 4

struct WidgetEntryView : View {
    
    
    var entry: Provider.Entry
    @Environment(\.widgetFamily) var family // 尺寸环境变量
    var body: some View {
    
    
        switch family{
    
    
        case .accessoryInline :
            Text("顶部文字")
        case .accessoryCircular :
        	ZStack {
    
    
          		AccessoryWidgetBackground()
            	Text("1x1组件")
         	}
        case .accessoryRectangular :
            Text("1x2组件")
        default :
            Text("默认")
        }
    }
}

参考文献

本人新手,如果有写错的地方欢迎指正,期待和大家一起交流开发。

„Apple-creating-a-widget-extension“
„Apple-widgetfamily“
„Apple-Creating Lock Screen Widgets and Watch Complications“ „
iOS14 Widget Development Stepping Pit (1) Überarbeitete Version – Erstidentifizierung und Aktualisierung“
„iOS14WidgetKit Development Practice 1- 4》

Je suppose que tu aimes

Origine blog.csdn.net/qq_38718912/article/details/127389157
conseillé
Classement