当前位置: 首页 > 科技观察

如何为我们的应用程序实现锁屏小部件

时间:2023-03-19 15:38:36 科技观察

iOS最受欢迎的功能之一是可自定义的锁屏。终于在最新发布的iOS16中实现了。我们可以用可浏览的小部件填充锁屏。实现锁屏小部件很简单,因为它的API与主屏幕小部件共享相同的代码。本周我们将学习如何为我们的应用程序实现锁屏小部件。让我们从您可能已经拥有的应用程序主屏幕小部件代码开始。structWidgetView:View{letentry:Entry@Environment(\.widgetFamily)privatevarfamilyvarbody:someView{switchfamily{case.systemSmall:SmallWidgetView(entry:entry)case.systemMedium:MediumWidgetView(entry:entry)案例。systemLarge,.systemExtraLarge:LargeWidgetView(entry:entry)default:EmptyView()}}}在上面的示例中,我们有一个定义小部件的典型视图。我们使用环境来了解小部件系列并显示适当的大小。我们需要做的就是删除默认语句并实现所有定义锁屏小部件的新用例。structWidgetView:View{letentry:Entry@Environment(\.widgetFamily)privatevarfamilyvarbody:someView{switchfamily{case.systemSmall:SmallWidgetView(entry:entry)case.systemMedium:MediumWidgetView(entry:entry)案例。systemLarge,.systemExtraLarge:LargeWidgetView(entry:entry)案例.accessoryCircular:Gauge(value:entry.goal){Text(verbatim:entry.label)}.gaugeStyle(.accessoryCircularCapacity)case.accessoryInline:Text(verbatim:entry.label))case.accessoryRectangular:VStack(alignment:.leading){Text(verbatim:entry.label)Text(entry.date,format:.dateTime)}default:EmptyView()}}}最好记住系统对锁定屏幕不敏感使用与主屏幕小部件不同的渲染模式。系统为我们提供了三种不同的渲染模式。主屏幕小部件和WatchOS支持全彩色模式的色彩。是的,从watchOS9开始,你也可以使用WidgetKit来实现watchOS的复杂性。充满活力的模式是当系统将文本、图像和仪表恢复为单色并正确为锁定屏幕背景着色时。重音模式(accentedmode)只在watchOS上使用,系统将widget分为默认和重音两种。系统使用用户在表盘设置中选择的色调为小部件的强调部分着色。渲染模式可通过SwiftUIEnvironment变量获得,因此您始终可以检查哪种渲染模式处于活动状态并将其反映在您的设计中。例如,不同的图片可以采用不同的渲染方式。structWidgetView:View{letentry:Entry@Environment(\.widgetRenderingMode)privatevarrenderingModevarbody:someView{switchrenderingMode{case.accented:AccentedWidgetView(entry:entry)case.fullColor:FullColorWidgetView(entry:entry)案例。vibrant:VibrantWidgetView(entry:entry)default:EmptyView()}}}如上所示,我们使用widgetRenderingMode环境值来获取实际的渲染模式并表现出不同的行为。如前所述,在重音模式下,系统将小部件分为两部分并赋予它们特殊的颜色。部分视图层次结构可以用widgetAccentable视图修饰符标记。在这种情况下,系统将知道将着色颜色应用到哪些视图。structAccentedWidgetView:View{letentry:Entryvarbody:someView{HStack{Image(systemName:"moon").widgetAccentable()Text(verbatim:entry.label)}}}最后,我们需要配置支持的类型小部件。@mainstructMyAppWidget:Widget{letkind:String="Widget"varbody:someWidgetConfiguration{StaticConfiguration(kind:kind,provider:Provider()){entryinWidgetView(entry:entry)}.configurationDisplayName("Myappwidget").supportedFamilies([.systemSmall,.systemMedium,.systemLarge,.systemExtraLarge,.accessoryInline,.accessoryCircular,.accessoryRectangular])}}如果您仍然支持iOS15,您可以查看新锁屏小部件的可用性。@mainstructMyAppWidget:Widget{letkind:String="Widget"privatevarsupportedFamilies:[WidgetFamily]{if#available(iOSApplicationExtension16.0,*){return[.systemSmall,.systemMedium,.systemLarge,.accessoryCircular,.accessoryRectangular,.accessoryInline]}else{return[.systemSmall,.systemMedium,.systemLarge]}}varbody:someWidgetConfiguration{StaticConfiguration(kind:kind,provider:Provider()){entryinWidgetView(entry:entry)}.configurationDisplayName("我的应用小工具”).supportedFamilies(supportedFamilies)}}