UIkit์ ๋ํด์ → 2023.07.16 - [iOS] - UIKit vs SwiftUI ์ ๋ํด์ - (1)
SwiftUI ๋?
์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI) ํ๋ ์์ํฌ๋ก, iOS, macOS, watchOS, tvOS ์ฑ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์ต์ UI ํดํท์ด๋ค.
Swift ์ธ์ด์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ์ ์ธ์ ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ UI๋ฅผ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ๊ตฌ์ถํ ์ ์๋ค.
UIKit์ ViewController์ Storyboard๋ฅผ ์ค์ฌ์ผ๋ก UI๋ฅผ ๊ฐ๋ฐํ๋ค. ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํด์ UI ์์๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ฐฐ์นํ๊ณ ์ฝ๋๋ก ์ด๋ฅผ ์กฐ์ํ๋ค.
SwiftUI์ ์ฃผ์ ํน์ง๊ณผ ๊ธฐ๋ฅ (์์ ์ฝ๋)
์ ์ธ์ ๊ตฌ๋ฌธ
SwiftUI๋ ์ ์ธ์ ์ธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ UI๋ฅผ ์ค๊ณํ๋ค.
์ฝ๋๋ก UI ์์๋ค์ ์ค๋ช ํ๊ณ ๊ตฌ์ฑํ๋ ๋์ , SwiftUI๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
์ด๋ก ์ธํด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค๋ ์ฅ์ ์ด ์๋ค.
import SwiftUI
struct MyView: View {
// body ํ๋กํผํฐ๋ View๋ฅผ ๋ฐํํ๋ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ก, ๋ทฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์
var body: some View {
// VStack์ ์ธ๋ก๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๋ ์ปจํ
์ด๋
VStack {
Text("Hello, SwiftUI!") //ํ
์คํธ ํ์
Button("Tap Me!") { //์ฌ์ฉ์์ ํญ์ ์ฒ๋ฆฌํ๋ ๋ฒํผ
print("Button tapped!") //๋ฒํผ์ ํญํ์ ๋ ์คํ๋๋ ํด๋ก์
}
}
}
}
// ๋ทฐ ์ธ์คํด์ค ์์ฑ ๋ฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
import PlaygroundSupport
// Playground์์ MyView์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ํ์ํฉ๋๋ค.
PlaygroundPage.current.setLiveView(MyView())
์๋ํ๋ ๋ ์ด์์
SwiftUI๋ UI ์์๋ค์ ๋ ์ด์์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ์ค์ ํ๋ ๋ฐ ํ์ํ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ์์ฑํ ํ์ ์์ด, ์๋์ผ๋ก ์ต์ ์ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ค.
import SwiftUI
struct MyView: View {
var body: some View {
// HStack์ ๊ฐ๋ก๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๋ ์ปจํ
์ด๋
HStack(spacing: 20) {
Image("icon") // ์ด๋ฏธ์ง ํ์
.resizable()
.frame(width: 50, height: 50)
// VStack์ ์ธ๋ก๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๋ ์ปจํ
์ด๋
VStack {
Text("Title") // ํ
์คํธ ํ์
.font(.headline) // ๊ธ์ ํฌ๊ธฐ ์ง์
Text("Description")
.font(.subheadline) // ๊ธ์ ํฌ๊ธฐ ์ง์
}
}
}
}
ํฌ๋ก์ค ํ๋ซํผ ์ง์
iOS, macOS, watchOS, tvOS ์ ๊ฐ์ ๋ค์ํ ํ๋ซํผ์์ ๋์ผํ ์ฝ๋๋ฅผ ๊ณต์ ํ์ฌ ์ฑ์ ๊ฐ๋ฐํ ์ ์๋ค.
์ข ๋ฅ๊ฐ ๋ค์ํ Apple ๊ธฐ๊ธฐ๋ค์ ๋์ํ๋ ์ฑ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
import SwiftUI
struct MyView: View {
var body: some View {
// #if os() ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ ํ๋ซํผ ๋ณ๋ก ๋ค๋ฅธ ๋ทฐ๋ฅผ ํ์
#if os(iOS)
Text("iOS")
#elseif os(macOS)
Text("macOS")
#elseif os(watchOS)
Text("watchOS")
#else
Text("tvOS")
#endif
}
}
์ค์๊ฐ ํ๋ฆฌ๋ทฐ
์ค์๊ฐ์ผ๋ก UI๋ฅผ ํ๋ฆฌ๋ทฐํ๊ณ ์์ ์ฌํญ์ ์ฆ์ ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค UI ๋ณ๊ฒฝ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ํ์ธํด์ ๊ฐ๋ฐ์๋ค์๊ฒ ์์ฐ์ฑ์ ๋์ฌ์ค๋ค.
import SwiftUI
struct MyView: View {
var body: some View {
Text("Hello, SwiftUI!")
}
}
#if DEBUG
import SwiftUI
struct MyView_Previews: PreviewProvider {
static var previews: some View {
MyView() // MyView์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์์ฑํ์ฌ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ฐฝ์ ํ์
}
}
#endif
๋ชจ๋ํ ๋ฐ ์ฌ์ฌ์ฉ์ฑ
๋ชจ๋ํ์ ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์กฐํ๋ค. UI ์์๋ค์ ์ปค์คํ ๋ทฐ๋ก ์ ์ํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ด์ ์ฑ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ค.
import SwiftUI
struct CustomButton: View {
var title: String // ๋ฒํผ์ ํ์๋ ํ
์คํธ
var action: () -> Void // ๋ฒํผ์ด ํญ๋์์ ๋ ์คํ๋ ํด๋ก์
var body: some View {
Button(action: action) {
// ๋ฒํผ ๋ด๋ถ์ ํ
์คํธ๋ฅผ ๋ฐฐ์น
Text(title)
.foregroundColor(.white)
.padding()
.background(Color.blue)
.cornerRadius(8)
}
}
}
Dark Mode ์ง์
Dark Mode๋ฅผ ์๋์ผ๋ก ์ง์ํ์ฌ ์ฑ์ด ๋ผ์ดํธ ๋ชจ๋์ ๋คํฌ ๋ชจ๋ ์ฌ์ด์์ ์์ฐ์ค๋ฝ๊ฒ ์ ํํด์ค๋ค.
import UIKit
class FirstViewController: UIViewController {
// FirstViewController์ ์ฝ๋
}
class SecondViewController: UIViewController {
// SecondViewController์ ์ฝ๋
}
// UITabBarController๋ฅผ ์ฌ์ฉํ์ฌ ํญ ํ๋ฉด ์ ํํ๊ธฐ
let tabBarController = UITabBarController()
let firstVC = FirstViewController()
let secondVC = SecondViewController()
tabBarController.viewControllers = [firstVC, secondVC]
์ ๋๋ฉ์ด์ ๊ณผ ์ํ ๊ด๋ฆฌ
์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๊ฑฐ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
import SwiftUI
struct MyView: View {
// ์ํ ๋ณ์ isAnimating์ ์ ์ธ
@State private var isAnimating = false
var body: some View {
Button("Animate") {
// ๋ฒํผ์ ํญํ์ ๋, ์ ๋๋ฉ์ด์
์ ์ ์ฉ
withAnimation {
// isAnimating์ ํ ๊ธํ์ฌ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ ์ฉ
self.isAnimating.toggle()
}
}
// ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์กฐ์
.scaleEffect(isAnimating ? 1.5 : 1.0)
}
}
SwiftUI์ ์ฅ์
๊ธฐ์กด์ UI ํ๋ ์์ํฌ์ ๋นํด ํจ์ฌ ๊ฐํธํ๊ณ ๋ฐ์ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ก ์ธํด iOS ์ฑ ๊ฐ๋ฐ์ ๋์ฑ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
ํนํ ์ ์ํ ๊ฐ๋ฐ๊ณผ ๋ค์ํ ํ๋ซํผ ์ง์์ผ๋ก ์ธํด SwiftUI๋ ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ธ๊ธฐ๊ฐ ์๊ณ , ์์ผ๋ก ๋์ฑ ๋ฐ์ ํ ๊ฒ์ผ๋ก ๊ธฐ๋๋๋ค.
'๐ฑ Mobile > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS - Swift] extension(ํ์ฅ) ์ ๋ํด (0) | 2023.07.31 |
---|---|
iOS - Delegate Pattern (๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด) (0) | 2023.07.28 |
iOS - 2023๋ ์ต์ iOS ๊ฐ๋ฐ ๋ํฅ๊ณผ ์ ๋ฐ์ดํธ (feat. WWDC 2023) (0) | 2023.07.24 |
iOS - MVC(Model-View-Controller) ํจํด์ด๋ ๋ฌด์์ผ๊น? (0) | 2023.07.20 |
iOS - UIKit vs SwiftUI ์ ๋ํด์ (1) (0) | 2023.07.16 |