์๋ ํ์ธ์ Foma๐ ์ ๋๋ค!
์ผ๋ง ์ ์ ์ ํ๋ธ์์ ๋งํ๊ฒฝ iOS ๊ฐ๋ฐ๊ธฐ๋ฅผ ๋ณด๋ค๊ฐ (https://www.youtube.com/watch?v=W_1FoBtaV7A)
UI๋ฅผ ๊ฐ๋ฐํ๋๋ฐ ์คํ ๋ฆฌ๋ณด๋์ ์ฝ๋๋ก ๊ตฌํํ๋ ์ฅ๋จ์ ์ ๋ชจ๋ ์ด์ฉํ ์ ์๋๊ฒ UIKit์์ Preview๋ฅผ
์ฌ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋๋ผ๊ตฌ์.
Preview๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ก ํ๋ฉด์ ๊ตฌํํ๋๋ผ๋ ์ง๊ด์ ์ผ๋ก ํ๋ฉด์ ๋ณผ ์ ์๊ณ ๋ํ ์คํ ๋ฆฌ๋ณด๋๋ก ๊ฐ๋ฐํ ๋
์๊ธฐ๋ ์ถฉ๋ ๋ฌธ์ ๋ฑ์ ์์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ !
๊ทธ๋์ ์ค๋์ UIKit์์ Preview๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค~
UIViewController + Extension
์๋์ ๊ฐ์ด ํ๋ฆฌ๋ทฐ ์ต์คํ ์ ์ ๋ง๋ค์ด์ค์ ์ด๋ค ๋ทฐ์ปจํธ๋กค๋ฌ์์๋ ์ธ ์ ์๊ฒ ๋ง๋ค์ด์ค๋๋ค.
import SwiftUI
#if DEBUG
extension UIViewController {
private struct Preview: UIViewControllerRepresentable {
let viewController: UIViewController
func makeUIViewController(context: Context) -> UIViewController {
return viewController
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
}
}
func toPreview() -> some View {
Preview(viewController: self)
}
}
#endif
ViewController
๋ทฐ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด์ import SwiftUI๋ฅผ ํด์ฃผ์๊ณ
์๋์ PreviewProvider๋ฅผ ๋ง๋ค์ด์ค ๋ค ํด๋น ViewController๋ฅผ toPreview() ๋ฉ์๋๋ก ํ๋ฆฌ๋ทฐ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
import SwiftUI
struct VCPreView:PreviewProvider {
static var previews: some View {
ViewController().toPreview()
}
}
์คํ ๋ฆฌ๋ณด๋์ผ ๊ฒฝ์ฐ
์คํ ๋ฆฌ๋ณด๋ ์์ด๋๋ฅผ ์ ํด์ฃผ์๊ณ
์๋์ ๊ฐ์ด ์ ์ฉํด์ค๋๋ค.
struct VCPreView:PreviewProvider {
static var previews: some View {
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ViewController").toPreview()
}
}
์ด๋ ๊ฒ ์คํํด์ฃผ์๋ฉด ์๋์ ๊ฐ์ด ํ๋ฆฌ๋ทฐ ํ๋ฉด์ด ๋ํ๋ ๊ฑธ ๋ณผ ์ ์์๊ฑฐ์์!
ํ๋ฆฌ๋ทฐ ์ธ๋ถ ์ค์ ํ๊ธฐ
ํ๋ฆฌ๋ทฐ ํ๋ฉด์์ ์์ชฝ์์ ์๋ ๋ฒํผ์ ๋๋ฅด๋ฉด
์ด๋ฆ,๋๋ฐ์ด์ค,๋ ์ด์์,๋ฐฉํฅ ๋ฑ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์๋ ๋ฒํผ์ ๋๋ฅด์๋ฉด ๋๋ฐ์ด์ค๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค ์ ์๋๋ฐ์.
ํ๋ฒ ๋๋ฅผ ๋๋ง๋ค ์๋์ ๊ฐ์ด ๋๋ฐ์ด์ค๊ฐ ์ฌ๋ฌ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ ๋ฒํผ๋ค์ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ์ฝ๋๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์์๊ฑฐ์์.
struct VCPreView:PreviewProvider {
static var previews: some View {
Group {
ViewController()
.toPreview()
.previewDevice("iphone 8")
.previewDisplayName("์์ดํฐ 8")
ViewController()
.toPreview()
.previewDevice("iPhone 12 Pro")
.previewDisplayName("์์ดํฐ 12 ํ๋ก")
.preferredColorScheme(.dark)
}
}
}
์๋ก ๋ค๋ฅธ ์ด๋ฆ๊ณผ ๋๋ฐ์ด์ค ๋คํฌ๋ชจ๋ ๋ฑ์ ์ ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ํ๋ฆฌ๋ทฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ค๋์ ์ด๋ ๊ฒ UIKit์์ ํ๋ฆฌ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
์ฝ๋๋ฅผ ์์ฑํ์๋ง์ ๋ฐ๋ก ํ๋ฉด์ ํ์ธํ ์ ์๊ณ ์๋ก ๋ค๋ฅธ ๋๋ฐ์ด์ค์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ฐ๋ก ํ์ธํ ์ ์์ด์
ํ์คํ ํธ๋ฆฌํ๊ณ ๊ฐ๋ฐ ์๋๋ ํฅ์๋์์ต๋๋ค.
ํ์ง๋ง ํ๋ฆฌ๋ทฐ๊ฐ ๋๋ฐ์ด์ค ์ ์ฉ๋๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆด ๋๋ ์๊ณ ๋ก๋ฉ์ด ์ค๋ ๊ฑธ๋ฆด ๋๋ ์๊ณ ํฌ๋์ฌ๋ ์์ฃผ ๋๊ณ
ํ๋๋ผ๊ตฌ์.. (์ด๊ฑด ์ ์ ๊ฐ์ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค!)
ํน์๋ผ๋ ๊ถ๊ธํ์ ์ ์์ผ์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Reference
๋๊ธ