iOS 17 Beta 设备上的 Widget - 采用 containerBackground API

Cod*_*rew 26 widgetkit swiftui xcode15 ios17

我正在使用 Xcode 15 Beta 开发一个应用程序 + 小部件。该小部件在 iOS 17 Beta 模拟器上按预期工作,但在我的 iOS 17 Beta 设备上运行时,它显示“请采用 containerBackground API”而不是所需的内容。

在此输入图像描述

我四处搜索,只能找到containerBackgroundLocationButton 但我根本没有使用 Core Location 。有人能指出为什么这里提到它吗?

Wil*_* T. 59

很棒的 Filip N\xc4\x9bme\xc4\x8dek文章,介绍了对此问题的修补程序,使其仍然可以在 iOS16 设备上运行。

\n

总而言之:

\n

添加带有操作系统检查的扩展:

\n
extension View {\n    func widgetBackground(_ backgroundView: some View) -> some View {\n        if #available(iOSApplicationExtension 17.0, *) {\n            return containerBackground(for: .widget) {\n                backgroundView\n            }\n        } else {\n            return background(backgroundView)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

添加widgetBackground到所有不同的小部件(当然,选择您的背景视图/颜色):

\n
var body: some View {\n    VStack {\n        // widget content\n    }\n    .widgetBackground(Color.black)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

此外,他还提到了一个关于 iOS17 小部件的有趣说明,它们会在您的设计中强制添加额外的边距填充。

\n

您可以在生成 WidgetConfiguration 时禁用此功能:

\n
var body: some WidgetConfiguration {\n    //IntentConfiguration stuff\n    .contentMarginsDisabled()\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Sco*_*man 15

有问题的修饰符是.containerBackground(_:for:),它是 iOS 17 及相关平台版本中的新增内容。

\n

使用它,您可以指定整个小部件的背景作为自定义视图的修饰符,例如:

\n
VStack {\n  Text("My widget")\n    .foregroundStyle(.secondary)\n}\n.containerBackground(.red.gradient, for: .widget)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,在某些地方,例如,如果您的小部件以新的待机模式显示,则容器背景可能根本不显示。

\n

您可以通过添加修饰符containerBackgroundRemovable(false)\xe2\x80\x93 来自定义此行为,尽管这可能会阻止您的小部件在某些上下文中完全显示。

\n

\\.showsWidgetContainerBackground如果您处于背景未显示的上下文中,更好的选择是订阅环境变量来调整您的小部件。

\n

更多详细信息,请参阅 WWDC 视频“将小部件带到新地方”。

\n