はじめに
iOS17でウィジェットを実行したら以下のような文がウィジェットに表示されました。
Please adopt containerBackground API
日本語にすると「containerBackground APIを採用してください。」らしいです。
全く表示されないのはまずいです。高速で対応します。
実装
extension View {
// ウィジェットのbackgroundを設定する
@ViewBuilder
func widgetBackground(_ style: some ShapeStyle) -> some View {
if #available(iOSApplicationExtension 17.0, *) {
self.containerBackground(for: .widget) {
ContainerRelativeShape().foregroundStyle(AnyShapeStyle(style))
}
} else {
self.background(AnyShapeStyle(style))
}
}
}
使い方
struct DemoWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Text("Time:")
Text(entry.date, style: .time)
Text("Emoji:")
Text(entry.emoji)
}
+ .widgetBackground(.red)
}
}
注意
Xcode15で新たにプロジェクトを作成した場合は、初期の段階でcontainerBackground
のための分岐が入っています。
新規プロジェクトで試される方はこのコードを削除して使用してください。
if #available(iOS 17.0, *) {
DemoWidgetEntryView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
} else {
DemoWidgetEntryView(entry: entry)
.padding()
.background()
}
おわり
iOS17でウィジェット関連めっちゃ変更入りましたね
公式ドキュメント
https://developer.apple.com/documentation/SwiftUI/View/containerBackground(_:for:)