Skip to content

Commit 41604ce

Browse files
committed
Create 240827_UIViewRepresentable,_UIViewControllerRepresentable.md
1 parent 0616c68 commit 41604ce

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# 240827 UIViewRepresentable, UIViewControllerRepresentable
2+
3+
SwiftUI ํ™˜๊ฒฝ์—์„œ UIKit ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
4+
5+
6+
8์›” 27์ผ (ํ™”)
7+
8+
9+
# ํ•™์Šต๋‚ด์šฉ
10+
11+
ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ผ๋ถ€ ํ™”๋ฉด์„ SwiftUI๋ฅผ ๋ฒ ์ด์Šค๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ์ง€ ๊ธฐ์ˆ  ๊ฒ€ํ† ๋ฅผ ํ•˜๋˜ ์™€์ค‘์—... ์ตœ์†Œ๋ฒ„์ „ `iOS 15.0`์—์„œ๋Š” ๊ธฐ์กด `UIScrollView`์˜ ์ค‘์š” ๊ธฐ๋Šฅ์ด SwiftUI์˜ `ScrollView`์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ UIScrollView๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ—ค์•ผํ•˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋‚ฌ๋‹ค.
12+
13+
์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์—์„œ๋Š” ์ตœ์†Œ๋ฒ„์ „ `iOS 18.0`์€ ๋˜์•ผ ์Šคํฌ๋กค๋ทฐ๊ฐ€ ๊ทธ๋‚˜๋งˆ ์“ธ๋งŒํ•˜๋‹ค๋Š” ํŒ๋‹จ์ด ๋“ค์—ˆ๊ณ , ๊ทธ์ „๊นŒ์ง€๋Š” UIScrollView๋ฅผ SwiftUI๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ์ง์ ‘ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
14+
15+
๊ทธ๋ž˜์„œ UIKit์˜ ์š”์†Œ๋ฅผ SwiftUI๋กœ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.
16+
17+
## UIViewRepresentable
18+
19+
* UIKit์˜ `UIView`๋ฅผ SwiftUI์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
20+
21+
### ํ•„์ˆ˜ ๊ตฌํ˜„ ๋ฉ”์„œ๋“œ
22+
23+
* `makeUIView(context:)`
24+
* SwiftUI์—์„œ ์‚ฌ์šฉํ•  UIView ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
25+
* UILabel, UIButton ๊ฐ™์€ UIKit์˜ ๋ทฐ๋ฅผ ์ด ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
26+
* `updateUIView(_:context:)`
27+
* SwiftUI์˜ ์ƒํƒœ์— ๋”ฐ๋ผ UIView๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
28+
* ์†์„ฑ ๋ž˜ํผ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถˆ๋ ค์ง„๋‹ค.
29+
30+
```swift
31+
struct MyCustomLabel: UIViewRepresentable {
32+
@Binding var text: String // ์™ธ๋ถ€์—์„œ ์ด ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด..
33+
34+
func makeUIView(context: Context) -> UILabel {
35+
let label = UILabel()
36+
label.text = text
37+
return label
38+
}
39+
40+
// ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถˆ๋ ค์ง„๋‹ค.
41+
func updateUIView(_ uiView: UILabel, context: Context) {
42+
uiView.text = text
43+
// ์—…๋ฐ์ดํŠธ๋ฅผ ์‹ค์ œ๋กœ ํ• ์ง€ ๋ง์ง€๋Š” ๊ตฌํ˜„์ž์˜ ๋ชซ์ด๋‹ค.
44+
}
45+
}
46+
```
47+
48+
## UIViewControllerRepresentable
49+
50+
* UIKit์˜ UIViewController๋ฅผ SwiftUI์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
51+
52+
### ํ•„์ˆ˜ ๊ตฌํ˜„ ๋ฉ”์„œ๋“œ
53+
54+
* `makeUIViewController(context:)`
55+
* UIViewController ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
56+
* UIImagePickerController ๊ฐ™์€ ์ปค์Šคํ…€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
57+
* `updateUIViewController(_:context:)`
58+
* SwiftUI์˜ ์ƒํƒœ์— ๋”ฐ๋ผ UIViewController๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
59+
60+
```swift
61+
struct MyCustomViewController: UIViewControllerRepresentable {
62+
func makeUIViewController(context: Context) -> UIViewController {
63+
let viewController = MyViewController()
64+
return viewController
65+
}
66+
67+
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
68+
// ํ•„์š”ํ•œ ๊ฒฝ์šฐ UIViewController๋ฅผ ์—…๋ฐ์ดํŠธ
69+
}
70+
}
71+
```
72+
73+
74+
## ๋А๋‚€ ์ 
75+
76+
* ์•„์ง SwiftUI์˜ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ๋งŒ์œผ๋กœ๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ์˜ ์•ฑ์„ ๋‹ค๋ฃจ๊ธฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. (iOS 15, 16 ๊ธฐ์ค€...)
77+
* ๋ญ”๋†ˆ์˜ ์Šคํฌ๋กค๋ทฐ๊ฐ€ ํŽ˜์ด์ง• ๊ธฐ๋Šฅ๋„ ์—†๊ณ ... offset ์ถ”์ ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์—†๋ƒ.... `TabView` ์“ฐ๊ฑฐ๋‚˜, `offset` ์ถ”์ ๊ธฐ๋Šฅ์€ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผํ•จ.
78+
* ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ์—” UIKit ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„์™€ ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ ํ›„ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
79+
* ์•„์ง์€... ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ํ™”๋ฉด์ด๋‚˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ๋Š” SwiftUI๋กœ ๊ตฌํ˜„ํ•ด๋ณผ๋งŒ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์ปฌ๋ ‰์…˜๋ทฐ๋‚˜ ์Šคํฌ๋กค๋ทฐ๋ฅผ ํ†ตํ•œ ๋ณต์žกํ•œ ํ™”๋ฉด ๋ฒ ์ด์Šค๋Š” UIKit์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋œ ๋“ค ๊ฒƒ ๊ฐ™๋‹ค.
80+
81+
๋‹ค์Œ์€ SwiftUI์˜ ์š”์†Œ๋ฅผ UIKit์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์ข‹์„ ์ง€ ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.
82+
83+
---
84+
85+
86+
# ์ฐธ๊ณ  ๋งํฌ
87+
88+
- [https://developer.apple.com/documentation/swiftui/uiviewrepresentable](https://developer.apple.com/documentation/swiftui/uiviewrepresentable)
89+
- [https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable](https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable)
90+
- [https://gist.github.com/aronbalog/2fade2ae3f9fa61dff0854aa661d20a6](https://gist.github.com/aronbalog/2fade2ae3f9fa61dff0854aa661d20a6)
91+
- [https://gist.github.com/mbernson/9090953d3f5ca4f129eb72ea58436fdd](https://gist.github.com/mbernson/9090953d3f5ca4f129eb72ea58436fdd)
92+
- [iOS 18 ์˜ฌ๋ฆฌ๋ฉด ๊ทธ๋•Œ ๋‹ค์‹œ ๋ณด์ž...](https://developer.apple.com/documentation/realitykit/model3d/onscrollvisibilitychange(threshold:_:))

0 commit comments

Comments
ย (0)