SwiftUI์ ๋ํด์ → 2023.07.16 - [iOS] - UIKit vs SwiftUI ์ ๋ํด์ - (1)
UIKit ์ด๋?
iOS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ด๋ค.
Apple์์ ๊ฐ๋ฐํ UIKit์ iOS ๊ฐ๋ฐ์ ํต์ฌ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ฑ์ ํ๋ฉด ๊ตฌ์ฑ, ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ, ์ ๋๋ฉ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ์ ๋ค๋ฃจ๋๋ฐ ํ์์ ์ธ ๋๊ตฌ๋ค์ ์ ๊ณตํ๋ค.
UIKit์ ViewController์ Storyboard๋ฅผ ์ค์ฌ์ผ๋ก UI๋ฅผ ๊ฐ๋ฐํ๋ค. ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํด์ UI ์์๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ฐฐ์นํ๊ณ ์ฝ๋๋ก ์ด๋ฅผ ์กฐ์ํ๋ค.
UIKit์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ๊ตฌ์ฑ ์์ (์์ ์ฝ๋)
UIView
UIKit์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์์ด๋ค. ํ๋ฉด์ ๋ณด์ด๋ ๋ชจ๋ UI ๊ฐ์ฒด๋ค์ ๊ธฐ๋ณธ ํด๋์ค์ด๋ค.
๋ฒํผ, ๋ ์ด๋ธ, ์ด๋ฏธ์ง๋ทฐ ๋ฑ ๋ค์ํ UI ์์๋ค์ UIView๋ฅผ ์์ํ์ฌ ์์ฑ๋๋ค.
import UIKit
class MyView: UIView {
override func draw(_ rect: CGRect) {
// ๋ทฐ ๋ด๋ถ์ ๊ทธ๋ฆฌ๊ธฐ
let context = UIGraphicsGetCurrentContext() //ํ์ฌ ๊ทธ๋ํฝ ์ปจํ
์คํธ ์ป์
context?.setFillColor(UIColor.blue.cgColor) //๊ทธ๋ํฝ ์ปจํ
์คํธ์ ์์์ blue๋ก ์ค์
context?.fill(rect) //์ฌ๊ฐํ์ blue๋ก ์ฑ์
}
}
UIViewController
ํ๋ฉด์ ๊ด๋ฆฌํ๊ณ View์ ๋์์ ์ ์ดํ๋ ํด๋์ค์ด๋ค.
ํ๋ฉด์ ๋ก๋ํ๊ณ ํด์ ํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ์ ํ์ ๊ด๋ฆฌํ๋ค.
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ก๋๋ ๋ ์คํ๋ ์ด๊ธฐํ ์์
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// ๋ทฐ๊ฐ ํ๋ฉด์ ๋ํ๋๊ธฐ ์ง์ ์ ์คํ๋ ์์
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// ๋ทฐ๊ฐ ํ๋ฉด์ ๋ํ๋ ํ์ ์คํ๋ ์์
}
}
UIWindow
์ฑ์ ๊ธฐ๋ณธ ์ฐฝ์ผ๋ก, ํ๋ฉด์ ํ์๋๋ ๋ชจ๋ ์ปจํ ์ธ ๋ฅผ ๊ด๋ฆฌํ๋ค.
์ต์์ ๋ทฐ์ด๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ๋ทฐ๋ค์ UIWindow ์์ ํ์๋๋ค.
UIViewController์ View Life Cycle
UIViewController๋ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ํธ์ถํ๋ค. viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear ๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
UINavigationController
ํ๋ฉด ์ ํ๊ณผ ๋ด๋น๊ฒ์ด์
์คํ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ์ปจํธ๋กค๋ฌ์ด๋ค.
์คํ ํํ๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค์ ๊ด๋ฆฌํ๋ฉฐ, ํ๋ฉด ์ ํ ์ ์ ๋๋ฉ์ด์ ๊ณผ ๋ด๋น๊ฒ์ด์ ๋ฐ๋ฅผ ์ ๊ณตํ๋ค.
import UIKit
class FirstViewController: UIViewController {
// FirstViewController์ ์ฝ๋
}
class SecondViewController: UIViewController {
// SecondViewController์ ์ฝ๋
}
// UINavigationController๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ์ ํํ๊ธฐ
let firstVC = FirstViewController()
let navController = UINavigationController(rootViewController: firstVC)
navController.pushViewController(SecondViewController(), animated: true)
UITabBarController
ํญ ํํ๋ก ํ๋ฉด์ ์ ํํ๊ณ ์ฌ๋ฌ ํญ๋ค ๊ฐ์ ์ปจํ ์ธ ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ด๋ค.
ํญ ๋ฐ๋ฅผ ํตํด ์ฌ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค ๊ฐ์ ์ฝ๊ฒ ์ ํํ ์ ์๋ค.
import UIKit
class FirstViewController: UIViewController {
// FirstViewController์ ์ฝ๋
}
class SecondViewController: UIViewController {
// SecondViewController์ ์ฝ๋
}
// UITabBarController๋ฅผ ์ฌ์ฉํ์ฌ ํญ ํ๋ฉด ์ ํํ๊ธฐ
let tabBarController = UITabBarController()
let firstVC = FirstViewController()
let secondVC = SecondViewController()
tabBarController.viewControllers = [firstVC, secondVC]
UIButton, UILabel, UIImageView
UIButton์ ๋ฒํผ, UILabel์ ํ ์คํธ๋ฅผ ํ์ํ๋ ๋ ์ด๋ธ, UIImageView๋ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ๋ทฐ ๋ฑ, ๋ค์ํ UI ์์๋ค์ด UIKit์ ๊ตฌํ๋์ด ์๋ค.
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// ๋ฒํผ
let button = UIButton(type: .system)
button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
button.setTitle("Click Me!", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
self.view.addSubview(button)
// ๋ ์ด๋ธ
let label = UILabel(frame: CGRect(x: 100, y: 200, width: 200, height: 50))
label.text = "Hello, World!"
self.view.addSubview(label)
// ์ด๋ฏธ์ง๋ทฐ
let imageView = UIImageView(frame: CGRect(x: 100, y: 300, width: 200, height: 150))
imageView.image = UIImage(named: "myImage")
self.view.addSubview(imageView)
}
@objc func buttonTapped() {
print("Button tapped")
}
}
์ ๋๋ฉ์ด์ ๊ณผ ๊ทธ๋ํฝ ์ฒ๋ฆฌ
UIKit์ UIView์ ์ ๋๋ฉ์ด์ ๊ธฐ๋ฅ๊ณผ ๊ทธ๋ํฝ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ํด๋์ค๋ค์ ์ ๊ณตํ๋ค.
UIView์ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ์ฌ ํ๋ฉด ์ ํ๊ณผ UI ์์์ ์์ง์์ ๊ตฌํํ ์ ์๋ค.
UIKit์ ์ฅ์
- ์ฌ์ฉ์ด ๊ฐํธํ๊ณ ์ง๊ด์ ์ด๋ค.
iOS ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ UI๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๊ฐ๋จํ ์ฝ๋๋ก ๋ค์ํ UI ์์๋ค์ ์์ฑํ๊ณ ๋ฐฐ์นํ ์ ์์ผ๋ฉฐ, Interface Builder๋ฅผ ํตํด ์๊ฐ์ ์ผ๋ก UI๋ฅผ ๋์์ธํ ์๋ ์๋ค.
- ๋ค์ดํฐ๋ธ ์ฑ๋ฅ
iOS ์ด์์ฒด์ ์ ์ต์ ํ๋์ด ์์ด์ ๋ค์ดํฐ๋ธ ์ฑ๊ณผ ๋์ผํ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค. ๋๋ฌธ์, ์ฑ์ด ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ผ๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์๋ค.
- ๋ค์ํ UI ์์๊ณผ ์ปค์คํฐ๋ง์ด์ง
๋ค์ํ UI ์์๋ค์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ์กฐํฉํ๊ณ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์ํ๋ ๋์์ธ๊ณผ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
- ์ ๋๋ฉ์ด์ ๊ณผ ๊ทธ๋ํฝ ์ฒ๋ฆฌ
UIView์ ์ ๋๋ฉ์ด์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ถ๋๋ฌ์ด ํ๋ฉด ์ ํ๊ณผ UI ์์์ ์์ง์์ ์ถ๊ฐํ ์ ์๋ค.
- ์์ ์ฑ๊ณผ ๋ณด์
Apple์์ ๊ฐ๋ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ๋๋ฌธ์ ์์ ์ฑ๊ณผ ๋ณด์์ ์ ๋ขฐ์ฑ์ด ์๋ค.
'๐ฑ 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 ์ ๋ํด์ (2) (0) | 2023.07.18 |