위젯의 사이즈는 small, medium, large가 있습니다. extraLarge의 경우 아이패드에서만 되는 것으로 알고 있어요.
이 중에서 저는 small 사이즈만 2 타입의 디자인으로 만들고 싶어 아래와 같이 구현해보았습니다.
우선은 PrevieProvider 프로토콜을 따르는 struct에서 아래와 같이 코드를 구현해주면 됩니다. family에서 한 사이즈만 지정해주면 됩니다.
struct cocoBabyWidget_Previews: PreviewProvider {
static var previews: some View {
cocoBabyWidgetEntryView(entry: SimpleEntry(date: Date(), babyNickName: "", dDay: "", dWeek: "", configuration: ConfigurationIntent()))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
.previewContext(WidgetPreviewContext(family: .systemSmall))
그리고 Widget 프로토콜을 따르는 struct에서 아래 소스코드를 추가해줍니다.
struct cocoBabyWidget: Widget {
let kind: String = "cocoBabyWidget"
var body: some WidgetConfiguration {
IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
cocoBabyWidgetEntryView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
.supportedFamilies([.systemSmall])
}
}
.supportedFamilies([.systemSmall])
디폴트로는 이렇게 3개의 사이즈가 나오는데요.
위와 같이 family에서 사이즈를 지정하면 원하는 사이즈만 위젯 추가시에 나타나는 것을 볼 수 있어요.
다음은 한가지 사이즈로 다양한 디자인, 혹은 포맷으로 구현하고 싶을 때가 있는데요. 이때 아래와 같이 구현하면 됩니다.
기본적으로 위젯을 2개 구현하고, 이 2개의 위젯을 메인에서 불러오는 개념인데요.
WidgetBundle 프로토콜을 통해서 구조체를 구현하고, Widget을 반환하는 인스턴스를 만들어 주면 됩니다.
첫번째 위젯, 두번째 위젯 둘다 .supportedFamilies([.systemSmall]) 로만 구현한 후에 WidgetBundle 을 이용하고, @main을 통해 가장 먼저 해당 구조체가 호출될 수 있도록 구현해줍니다.
@main
struct cocoBabyWidgetBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
cocoBabyWidget()
cocoBabySecondWidget()
}
}
2가지 디자인 타입의 같은 사이즈의 위젯이 구현된 것을 볼 수 있습니다.
최종 버전은 아래와 같습니다! ㅎㅎ
얼른 마무리하고 업뎃버전 출시하고 싶네요.
'[iOS] App Development' 카테고리의 다른 글
[iOS] 비동기 프로그래밍 : Sync, Async, Concurrent, Serial (0) | 2022.01.26 |
---|---|
[iOS] FireStore에서 데이터 정렬하기 : 쿼리방법(order by), 내림차순 (2) | 2022.01.08 |
[iOS] 동기/비동기 처리, 컴플리션 블럭(Completion Block) (0) | 2022.01.01 |
[iOS] SwiftUI 로 개발한 위젯에 Custom Font 사용하는 법(+폰트인식 못할 때) (0) | 2021.12.28 |
[iOS] 다이어리 앱 개발 : 테이블뷰에서 선택한 Row의 파이어스토어 문서 documentID값 아는법, 주의할 점 (0) | 2021.12.27 |