์ ํ ๋๋ฒจ๋กํผ ์์นด๋ฐ๋ฏธ์์ ๋ฌธํ์ผํฐ๋ก ์งํํ๊ณ ์๋ ํ๋์ ํ๋ก๊ทธ๋จ(?) ์๋ชจ์(?)์ ์ฐธ์ฌ์ค์ธ๋ฐ, ์ง๊ธ๊น์ง ๋ ๊ฐ์ ํด๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ์ง๋ง ํ๋ก์ ํธ ๊ธฐ๊ฐ ๊ฒน์นจ + ์ฝ๊ฐ์ ๋จธ๋ฆฌ์ ๋ฆฌ๊ฐ ์๋จ + ์ฝ๊ฐ์ ๊ฒ์ผ๋ฆ ์ผ๋ก ์
๋ก๋ํ์ง ๋ชปํ๋ค. ์ค๋ ์์ํ๋ toss ์ฑ ํด๋ก ์ฝ๋ฉ์ ๋งค์ผ๋งค์ผ ์กฐ๊ธ์ฉ ๊ฐ๋ฐํ๋ฉด์ ๊ฒช์๋ ์ด๋ ค์์ด๋ ๊ณ ๋ฏผ๋ค์ ์ ์ด๋ณด๋ ค๊ณ ํ๋ค.
๐ฃ ํ๋ก์ ํธ ์์ฑ
์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ด ์งํํ๋ ๋ฉํฐ๋ถ์ด ".gitignore"ํ์ผ๊ณผ "xcodeproj" ํด๋๋ ๋์ผํ ๊ฒฝ๋ก์ ์์ด์ผ ์ข๋ค๊ณ ๋ง์ํด์ฃผ์
จ๋ค. ์์ธํ ์ด์ ๋,,, ์ ๋ชป๋ค์์ง๋ง (๋ค์ ๋ฌผ์ด๋ณด๊ณ ์ ์ด๋์!) ๋์ค์ ์ ๊ทผํ๊ธฐ ํธํ๋ค๋..? ์ด๋ฐ์ด์ ์๋๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์๋ค.
์๋ ํ์์๋ ์๋์ ๊ฐ์ด ๋ง๋ค์์๋ค. ์์ผ๋ก๋ ์์์ฒ๋ผ ๋ง๋ค๊ฒ์ด๋ค!
(์๋์ ํ์ผ ๊ตฌ์กฐ๋ xcodeproj ํ์ผ์ด AppStoreClone ํด๋ ๋ด๋ถ์ ์์นํ๋ค.์ด๋ ๊ฒ depth๊ฐ ํ๋ ๋ ๋ค์ด๊ฐ๋ ๊ตฌ์กฐ๊ฐ ์๋๋ผ, ์์ฒ๋ผ depth๊ฐ ํ๋ ์ค์ด๋ ๊ฒฝ๋ก์ค์ ์ ์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ ํธํ๋ค๊ณ ํ๋ค!)
๐ฃ Code Base๋ก ๊ตฌํ
์ฌ์ค ์๋ํด์ Code Base๋ก ๊ตฌํํด์ผ์ง!!! ์ด๋ ๊ฒ ์๊ฐํ๊ฑด ์๋์๊ณ , ์ฒ์ Swift๋ฅผ ์ ํ๊ฒ SwiftUI์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ก ํ๋ฉด์ ๊ตฌ์ฑํ๋๊ฒ ๋ ์ต์ํ๋ค. ๋ฌผ๋ก storyboard๋ฅผ ํ์ฉํ๋๊ฒ ๋ ์ฝ๋ค๊ณ ๋ ํ์ง๋ง ์์ง ํฌ๊ฒ ์๋ฟ์ง ์์๋ค๊ณ ํด์ผํ๋?
ํ์ง๋ง, ์ถํ storyboard๋ ๋ค๋ฃฐ์ค ์์์ผ ํ๋ค๊ณ ํ๋, ์ฐจ์ฐจ ๋ฐฐ์๋ณด๋๋ก ํ์.
๋๋ ๊ทธ๋์ Main.storyboard๋ฅผ ์ญ์ ํ๊ณ code base๋ก ๊ตฌํํ๋ค.
๐ฃ Tab Bar ๊ตฌํ
https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/issues/3
๐พ UINavigationController vs. UIViewController
TabBar๋ฅผ ๊ตฌํํ ๋ ์ด๋ ๊ฒ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. UITabBarController๋ฅผ ์์๋ฐ์์, ๊ทธ ์์ ํญ๋ค์ ๊ตฌํํ ๋ ์ด๋ค ๊ฒ์ ์์๋ฐ์ ๊ตฌํํ ์ง ๊ณ ๋ฏผ์ด์๋ค. ๋ ๊ฐ์ ์ด๋ค ์ฐจ์ด์ ์ด ์กด์ฌํ๋์ง ์ ํํ ์ด์ ๋ฅผ ์๊ณ ์จ์ผ ๋ ๊ฒ ๊ฐ์๋ค.
https://www.zehye.kr/ios/2020/03/13/iOS_vc_navigation_vc/
๋ด๊ฐ ์ฐธ๊ณ ํ ๋ ํผ๋ฐ์ค์ด๋ค. ์ผ๋จ ์ด ๊ธ์ ์ดํดํ ๊ฒ์ ์๋์ ๊ฐ๋ค.
- UIViewController๋ ๋ชจ๋ ๋ทฐ๋ฅผ ๋จ๋ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๊ฐ ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ค๋ฅธ ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์งํ์ง ์๋๋ค. ํญ์ ํ๊ณ ํ๊ณ ๋์ด๊ฐ๋ ์ ์ ๋ค์ flow์์, ์ด์ ํญ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์์ง ์์ ์ ๋ณด์ ํ๋ฆ์ด ๋๊ธด๋ค๊ณ ์ดํดํ๋ค.
- ๊ทธ๋์ ์ ๋ณด์ ํ๋ฆ์ด ๋๊ธฐ์ง ์๊ณ ๋ทฐ์ ์ ํ์ด ๊ฐ๋ฅํ navigation์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
UINavigationController๋ฅผ ์ ํํ ์ด์ ์ ๋ํด์ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค. ๋ฉํ ์๊ฒ ๋ ์ ํํ ๋ต๋ณ์ด ๋ฌ๋ฆฌ๋ฉด ํฌ์คํ ์ ์์ ํด์ผ์ง
1. UIViewController๋ฅผ ์ฌ์ฉํ TabBar ์ฝ๋
// ui view controller
private lazy var gamesViewController: UIViewController = {
let viewController = UIViewController()
let tabBarItem = UITabBarItem(title: "Games", image: UIImage(systemName: "gamecontroller.fill"), tag: 1)
viewController.tabBarItem = tabBarItem
return viewController
}()
2. UINavigationController๋ฅผ ์ฌ์ฉํ TabBar ์ฝ๋ -- ํด๋น ๋ฐฉ์์ ์ ํ!
// navigation controller
private let homeViewController: UINavigationController = {
let viewController = HomeViewController()
let tabBarItem = UITabBarItem(
title: "ํ",
image: UIImage(systemName: "house.fill"),
tag: 0
)
viewController.tabBarItem = tabBarItem
let navigationView = UINavigationController(rootViewController: viewController)
return navigationView
}()
๋ชจ๋ UITabBarController ๋ด๋ถ์ ์๋ ํ๋์ 'ํญ'์ ๋ํ ์ฝ๋์ด๋ค. (์์ธํ ๊ฑด github ์ฐธ๊ณ )
๐พ TabBar layer ์์ ํ๊ธฐ (๋ฅ๊ทผ ํํ์ ํญ๋ฐ ๋ง๋ค๊ธฐ)
์ฐ์ ํ ์ค์ ํ๋ฉด์ ๋ณด๋ฉด ์๋์ฒ๋ผ ๋ฅ๊ทผ๋ชจ์์ TabBar๋ฅผ ๊ฐ์ง๋ค.
๋๋ ์ด๋ฐ ๋ชจ์์ ํญ๋ฐ๋ฅผ ๊ฐ์ง๋ผ๋ฉด ๋ฌด์กฐ๊ฑด custom ์ด ํ์ํ ์ค ์์๋๋ฐ, ๋จ์ํ layer cornerRadius๋ก ์์ ์ด ๊ฐ๋ฅํ๋ค.
extension TabBarController {
func configureTabBar() {
self.tabBar.tintColor = .label
self.tabBar.layer.cornerRadius = 20
self.tabBar.layer.masksToBounds = true
self.tabBar.layer.borderColor = UIColor.lightGray.cgColor //ํ
๋๋ฆฌ ์
self.tabBar.layer.borderWidth = 0.4 //tabbar ํ
๋๋ฆฌ ๊ตต๊ธฐ
}
}
์ด๋ ๊ฒ ๋ ์ด์ด๋ฅผ ์ก์์, viewDidLoad์์ ๋ฉ์๋๋ฅผ ์คํ์์ผ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ์ ์ฉ์์ผ์ค ๋์ ๊ฒฐ๊ณผ๋ฌผ์
์์ด์ฝ๋ค์ ๋ฐ๋ก ๊ฐ์ ธ์ฌ์๊ฐ ์์ด์ ์ต๋ํ ๋น์ทํ SF symbol์ ์ด์ฉํด์ ๋ฃ์ด์ฃผ์๋ค.
์ด ์ฝ๋์์๋ ๊ถ๊ธํ์ ์ด ์๊ฒจ์ ์๋ ์กฐ๊ธ ๋ง๋ถ์ฌ๋ณด์๋ฉด,
๐ tintcolor ๋?
The first nondefault tint color value in the view’s hierarchy, ascending from and starting with the view itself.
๋ทฐ ๊ณ์ธต์์ ๊ธฐ๋ณธ์ด ์๋ ์ฒซ ๋ฒ์งธ ์์กฐ ์์ ๊ฐ์ผ๋ก, ๋ทฐ ์์ฒด์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์์ํฉ๋๋ค.
- ์ ํ ๊ณต์๋ฌธ์
๋๋์ฒด ๋ฌด์จ์๋ฆฌ์ผ! ์กฐ๊ธ๋ ์ฝ์ด๋ณด๋ฉด ์์คํ ์ด ๊ณ์ธต์์ ๊ธฐ๋ณธ์ด ์๋ ์์์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, tintColor๊ฐ ๋์ ์์คํ ์์์ ์ ์ํ๋ค๊ณ ๋์ด์๋ค. ๊ณต์๋ฌธ์๋ต๊ฒ ์๋ฟ์ง ์๋ ์ค๋ช ์ด๋ผ์ ๊ตฌ๊ธ๋ง์ ํด๋ณธ ๊ฒฐ๊ณผ, ์กฐ๊ธ ๋ ์ดํดํ ์ ์์๋ค.
tintColor๋ ์๊ฐ์ ์ผ๋ก ํ๋ฉด ์์ ์ด๋ค ์์๊ฐ ํ์ฑํ ๋์๋์ง ๋ณด์ฌ์ฃผ๋ ์์๋ผ๊ณ ํ๋ค. ์๋ฅผ๋ค์ด NavigationBar์ ์์ดํ ์ Refresh๋ฒํผ์ด๋ Back๋ฒํผ์ ๋๋ฅด๋ฉด, ๋๋ฆฌ๊ธฐ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ํฐ์์ผ๋ก ๋ณํ๋ค๊ฐ ๋ค์ ์๋์์ผ๋ก ๋์์ค๋ ์ด๋ฐ์์! ์ด๋ฐ๊ฒ์ ๊ฐ๋ฅ์ผ ํ๋๊ฒ ๋ฐ๋ก tintColor๋ผ๊ณ ํ๋ค. (์ฐธ๊ณ ๋ํผ๋ฐ์ค)
๐ ์ฌ๊ธฐ ์๋ ์ฝ๋๊ฐ ์ดํด๊ฐ ๋์ง ์์๋ค.
์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค๊ณ ์ ๋ฒํผ ์์ด ๊ฒ์ ์์ผ๋ก ๋ณํ ๊น? ๊ฒฐ๊ณผ๋ฌผ์ ์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค. ์๋ ํญ๋ฐ์ ๊ธฐ๋ณธ ์์์ ํ๋์์ด๋ค. ํ๋์์ด์๋ค๊ฐ, ์๋ ์ฝ๋ ํ์ค๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฒ์ ์์ด ๋๋๋ฐ, ์ด์ ๊ฐ ๋ญ์ง!!
self.tabBar.tintColor = .label
.label. ๋ถ๋ถ์ red๋ก ๋ฐ๊พธ๋ฉด, ์๋์ฒ๋ผ ๋ฐ๋๋ค.
๊ทธ๋ผ ์ด์ ์ ๊ฒ์ ์์ธ๊ฐ! ๋ฅผ ์๋ ค๋ฉด, .label์ ์ดํด๋ณด๋ฉด ๋๋๋ฐ, optํค๋ฅผ ๋๋ฅด๊ณ label์ ํด๋ฆญํด๋ณด๋ฉด, ์ด๋ ๊ฒ label์ด UIColor์ด๊ณ , ํ ์คํธ ๋ผ๋ฒจ์ ์์์ด๋ผ๊ณ ๋์์๋ค. ๊ทธ๋์ ๊ฒ์ ์์ด ๋๋๊ฑฐ๊ตฌ๋!
๐พ TabBar ๋์ด ๋ณ๊ฒฝํ๊ธฐ
tab bar ์ ๋์ด๋ฅผ ๋ณ๊ฒฝํด์ฃผ์๋ค. ์ค์ toss์ ํญ๋ฐ ๋์ด๋ ๊ธฐ๋ณธ ๋์ด๋ณด๋ค๋ ์กฐ๊ธ ๋ฎ์ ๊ฒ ๊ฐ์๋ค. ํผ๊ทธ๋ง๋ก ์ฌ๋ดค๋๋ฐ 67์ ๋?
๊ทผ๋ฐ ๋ด๊ฐ ์ง๊ธ ๋ง๋ ํญ๋ฐ๋ ๋์ด๊ฐ 71์ธ๋ฐ, sf Symbol์ด ์กฐ๊ธ ์ปค์๊ทธ๋ฐ์ง ๋๋ฌด ๋ถ์์ฐ์ค๋ฝ๊ฒ ์์ด์ฝ์ด ์์ ๋ฑ!๋ถ์ด์๋๋ฏํ ๋๋์ด ๋ค์๋ค.
์ฌ๊ธฐ์ icon์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋๋ฐ, ๋๋ถ๋ถ custom tabBar๋ก ๊ตฌํํ๋ ๋ฏ ํ๋ค. ์ฐ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ถํฐ ์ตํ๋๊ฒ ๋์ ๋ชฉํ์๊ธฐ ๋๋ฌธ์, custom tabBar๊น์ง๋ ๊ฐ์ง ์๊ณ ๊ทธ๋ฅ ๋ด๊ฐ ๋ณด๊ธฐ ํธํ๊ฒ tabBar์ height๋ฅผ ๋์ฌ์ฃผ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
https://stickode.tistory.com/371
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var tabFrame = self.tabBar.frame
tabFrame.size.height = 88
tabFrame.origin.y = self.view.frame.size.height - 88
self.tabBar.frame = tabFrame
}
์ด๋ ๊ฒ override func์ ์ ๋ ฅํด์ฃผ๋ฉด frame์ด ์กฐ์ ๋๋ค.
๐ viewDidLayoutSubviews ๊ฐ ๋ญ๊น?
์ด๊ฒ์ view๋ฅผ renderํ๋๋ฐ์ life cycle..? ์ด ์๋๊ฒ ๊ฐ์๋ค. ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณด๊ณ ์ถ๊ฐ๊ณต๋ถ๋ฅผ ์งํํ๊ณ ๋ค๋ฅธ ๊ธ์์ ํฌ์คํ ํ ์์ ์ด๋ค. (uikit์ ์ด๋ฐ life cycle์ด๋ผ๊ณ ํ๋.. ์ด๋ฐ๊ฑธ ์ดํดํ๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ๋ค. ๋ฟ์์! ๐ค๐ป)
๐พ view ์์๊ณผ ํจ๊ป TabBar์์์ด ๋ฐ๋๋ ๋ฒ๊ทธ ํด๊ฒฐํ๊ธฐ
tab์ด ์ ๋ฐ๋๋์ง ๋ณด๊ธฐ ์ํด์ homeViewController๋ฅผ ์์ฑํด์ ์ฐ๊ฒฐํด์ค. ํด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ .blue ์์์ผ๋ก ์ ์ฉํด๋ณด์๋ค.
// HomeViewController
final class HomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
}
}
์ด๋ ๊ฒ ์ ์ฉํ๊ณ , tab bar์ ์ฐ๊ฒฐ์ ํด์ฃผ๋๊น ์๋์ ๊ฐ์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค.
์ฅ ๋ค๋ฅธ๋ฒํผ ์ด๋๊ฐ์ง? ๊ทธ๋ฆฌ๊ณ ์ ํญ๋ฐ ์์์ ๋จน์ด๋ฒ๋ฆฌ๋๊ฑฐ์ง???
๋์ ํ ๋ชจ๋ฅด๊ฒ ์ด์ ๋ทฐ hierachy๋ฅผ ์ดํด๋ณด์๋ค.
์ ์ด๋ ๊ฒ ๋ณํ๋๊ฑธ๊น? ์์ง์ ์ด๊ฒ ์ ์ด๋ ๊ฒ ๋ณํ๋๊ฐ? ์ ๋ํ ํด๋ต์ ์ฐพ์ง ๋ชปํ๋ค. (์์๋๋ถ ์๋ ค์ฃผ์ธ์ ํก..)
๊ทธ๋์ ์ผ๋จ, tabBar์ backgroundcolor๋ฅผ ์ฃผ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๊ฟ์ ์ผ๋จ ๋ฒ๊ทธ๋ ํด๊ฒฐํ๋ค. github pullrequest๋ฅผ ๋ ๋ฆด๋ ์ง๋ฌธ์๋ ์จ๋จ๋๋ฐ, ์ด๋ ๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ๋ง๋ ๋ฐฉ๋ฒ์ธ์ง ์๋ฌธ์ด๋ค.
extension TabBarController {
func configureTabBar() {
self.tabBar.tintColor = .label
self.tabBar.layer.cornerRadius = 20
self.tabBar.layer.masksToBounds = true
self.tabBar.layer.backgroundColor = UIColor.systemBackground.cgColor // ์ฌ๊ธฐ์ ํด๊ฒฐ
self.tabBar.layer.borderColor = UIColor.lightGray.cgColor
self.tabBar.layer.borderWidth = 0.4
}
}
๐ฃ Tab Bar ์์ฑ๋ณธ
์ด๋ ๊ฒ ํด์ ์ต์ข
tabbar ๊ตฌํ UI๋ ์๋์ ๊ฐ๋ค. (ํ์๋ง green ์์์ ๋ฃ์ viewcontroller๋ฅผ ์ฐ๊ฒฐ์์ผ๋จ๋ค! ๋๋จธ์ง๋ ๋น view).
ํญ๋ฐ๋ฅผ ๊ตฌํํ ์ต์ข
์ฝ๋๋ ์๋ ๊นํ๋ธ์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/pull/4
๋ค์ ํฌ์คํ ์ ์ค๋ ๊ฐ์ก๋ ์๋ฌธ์ ๋ํ ํฌ์คํ ๊ณผ ์ฝ๋๋ฆฌ๋ทฐ๋ฐ์ ๋ถ๋ถ์ ๋ํด์ ์ด๋ป๊ฒ ์์ ํด๋๊ฐ๋์ง ์์ฑํ ๊ฒ์ด๋ค!
'potato's iOS Story > CloneApp + ์ฝ๋๋ฆฌ๋ทฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CloneApp] (UIKit) toss ์ฑ ํด๋ก ์ฝ๋ฉ - (2) Home ํญ UI ๋ง๋ค๊ธฐ (0) | 2022.07.14 |
---|---|
[iOS/Swift] xcode์ SwiftLint ์ค์นํ๊ธฐ (0) | 2022.05.29 |
[iOS] Swift๋ก ์์ฃผ ๊ฐ๋จํ Todo List ๋ง๋ค๊ธฐ (1) (0) | 2022.02.04 |