ํฐ์คํ ๋ฆฌ ๋ทฐ
iOS) iOS 17 Widget error - Please adopt containerBackground API ํด๊ฒฐํ๊ธฐ(remove iOS 17 widet extra padding)
hyun99999 2023. 11. 7. 23:04๐ ๋ด์ฉ
iOS 17 containerBackground API error ์ extra padding ์ด ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค.
- iOS 17 ์ ์ฉ ํ์ ์ ๊ธํ๋ฉด ์์ ฏ์ด ์ ๋๋ก ๋ณด์ด์ง ์๋ ์ด์๊ฐ ๋ฐ์ํ์ต๋๋ค. Xcode ์์ ํ ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Xcode ์์ preview ๋ก ํ์ธํด๋ณด๋ คํ๋๋ ํด๋น ๊ฒฝ๊ณ ๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
“Ensure that you have called the containerBackground(for: .widget) {…} modifier in your widget view.”
๐ containerBackground(for:alignment:content:)
๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
containerBackground(for:alignment:content:) | Apple Developer Documentation
๋ทฐ๋ฅผ ์ฌ์ฉํด์ ๋๋ฌ์ธ๋ container ์ container background ๋ฅผ ์ค์ ํฉ๋๋ค.
Parameters
- alignment :The alignment that the modifier uses to position the implicit ZStack that groups the background views. The default is center.
- container :The container that will use the background.
- content : The view to use as the background of the container.
Discussion
ํด๋น modifier ๋ ์ ์ฒด parent container ๋ฅผ ์๋์ผ๋ก ์ฑ์ฐ๋ ์ ์์ background(_:ignoresSafeAreaEdges:) ์ ๋ค๋ฆ ๋๋ค.
- ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค!
if #available(iOSApplicationExtension 17.0, *) {
Image("widgetEmpty")
.resizable()
.scaledToFill()
.containerBackground(for: .widget) {
// ...
}
} else {
Image("widgetEmpty")
.resizable()
.scaledToFill()
}
์ด์ ์ผ ํ๋ฆฌ๋ทฐ์์ ์๋ฌ ์์ด ํ์ธํ ์ ์๊ฒ ๋์์ต๋๋ค.
background ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ containerBackground(for:) modifier ๋ฅผ ์ฌ์ฉํด์ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
๐ซข ??? ์ ์ฌ๋ฐฑ์ ๋ญ์ง?
๐จ ํธ๋ฌ๋ธ ์ํ
- ๊ทธ๋ฐ๋ฐ ์์ง ์์ฑ์ ์๋๋๋ค! ์๋ฌ๊ฐ ๋์ง ์์ ๋ฟ์ด์ง ์ ์๋ ์๋ padding ์ด ์๊ฒผ์ต๋๋ค.
๋ง์ ์ปค๋ฎค๋ํฐ์์๋ iOS 17 widget extra padding ์ ๋ํ ์ง๋ฌธ๋ค์ด ์ฌ๋ผ์ ์์์ต๋๋ค.
๐ contentMarginsDisabled
contentMarginsDisabled() | Apple Developer Documentation
WWDC 23 > Bring widgets to new places ์์ contentMarginsDisabled() ๋ฅผ ์ฌ์ฉํด์ safe area ๋ฅผ ๋นํ์ฑํํ ์ ์๋ค๊ณ ์๋ดํ๊ณ ์์ต๋๋ค.
๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
default content margins ์ด๋ผ๊ณ ํํํ๋ ๊ฒ์ ๋ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋๋ ๊ฐ์ ๋นํ์ฑํํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Return Value :
default content margins ๋ฅผ ์ฌ์ฉํ์ง ์๋ widget configuration ์ ๋ฐํํฉ๋๋ค.
Discussion :
content margins ์ ๋นํ์ฑํํ๋ฉด ์์ ฏ์ content ์ฃผ์์ ๋ง์ง์ ์๋์ผ๋ก ์ถ๊ฐํ์ง ์์ต๋๋ค. custom margins ์ ์ง์ ํ๊ธฐ ์ํด์ widgetContentMargins ๋ฅผ padding() ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํด๋น modifier ๋ iOS 17, watchOS 10, macOS 14 ์ด์ ์ ๋ฒ์ ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
(์ฆ, ๋ณ๋์ if #available ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค!)
๋ฐํ ๊ฐ์ด WidgetConfiguration ์ ๋๋ค. ์ ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
containerBackground(for:) ์ฒ๋ผ View ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋ WidgetConfiguration ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ์์น๊ฐ ๋ค๋ฆ ๋๋ค.
struct ExampleEntryView: View {
// ...
var body: some View {
if #available(iOSApplicationExtension 17.0, *) {
Text("Example")
// ...
// โ
.containerBackground(for: .widget) { }
} else {
Text("Example")
// ...
}
}
struct ExampleWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind,
provider: Provider()) { entry in
ExampleEntryView(entry: entry)
}
.configurationDisplayName("...")
.description("...")
.supportedFamilies([.systemSmall])
// โ
.contentMarginsDisabled()
.containerBackgroundRemovable(false)
}
}
// ๐จ preview ์์๋ ์์ง๋ content margin ์ด ์๋๋ฐ์..???
// ๐ preview ์์๋ `contentMarginsDisabled()` ๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๊ฒ ๊ฐ์ต๋๋ค.
struct ExampleWidget_Previews: PreviewProvider {
static var previews: some View {
// View ๋ฅผ ์ฌ์ฉ
ExampleEntryView(entry: ExampleEntry(date: Date()))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
preview ์์ content margin ์ด ๋ณด์ด๋๋ผ๋ ์ค์ ๋ก ๋น๋ํด๋ณด๋ฉด content margin ์ด ์ฌ๋ผ์ง์ ํ์ธ ํ ์ ์์ต๋๋ค!
ํน์๋ํด์ iPhone ์ ๊น๋ ค์๋ ์ฑ๋ค์ ์ดํด๋ดค์ต๋๋ค. KREAM(ํฌ๋ฆผ ์ฌ๋ํฉ๋๋ค๐งก), Instagram(์ธ์คํ ์ฌ๋ํฉ๋๋ค๐ซถ) ์ฑ์์ content margins ์ ๋ณผ ์ ์์์ด์.. ์๋ง ์ด๊ฒ๋๋ฌธ์ ๋ ์ด์์์ด ์ข ์ด๊ธ๋ ๊ฒ์ฒ๋ผ๋ ๋ณด์์ต๋๋ค.(2023-11-08 ๊ธฐ์ค)
์ด์ธ์๋ ๋ง์ ์ฑ๋ค์ ์์ ฏ๋ค์ ์ด๋ฏธ ๋์ํ๊ณ ์์์ต๋๋ค. "Please adopt containerBackground API" error ๋ค์ ์ฐพ์๋ณผ ์๋ ์๋๋ผ๊ตฌ์.
์ ๊ฐ ์งํํ๋ ํ๋ก์ ํธ๋ ์ด๋ฒ ์ ๋ฐ์ดํธ์์ ๋์ ์์ ์ ๋๋ค! ํน์๋ ์๋ฌ๋ฅผ ๋ณด๊ณ ์ถ์ผ์๋ฉด ์ค์นํด์ ์์ ฏ์ผ๋ก ํ์ธํด๋ณด์ธ์ ๐คฃ
- ๊นํ๋ธ
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- WWDC22
- containerBackground
- projectsetting
- 2022 KAKAO TECH INTERNSHIP
- github
- configurable widget
- Swift
- rxswift
- CloneCoding
- SwiftUI
- UserDefaults
- MVVM
- Protocol
- ์๋ฒํต์
- Notification
- Objective-C
- RxCocoa
- Algorithm
- WWDC
- urlsession
- Firebase
- Widget
- OpenSourceLibrary
- MOYA
- YPImagePicker
- WidgetKit
- watchOS
- APNS
- async/await
- IOS
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Total
- Today
- Yesterday