Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

potato's iOS Story/CloneApp + ์ฝ”๋“œ๋ฆฌ๋ทฐ

[CloneApp] (UIKit) toss ์•ฑ ํด๋ก ์ฝ”๋”ฉ - (1) TabBar ๋งŒ๋“ค๊ธฐ

๊ฐ์ž ๐Ÿฅ” 2022. 6. 30. 01:13
๋ฐ˜์‘ํ˜•

 

์• ํ”Œ ๋””๋ฒจ๋กœํผ ์•„์นด๋ฐ๋ฏธ์—์„œ ๋ฌธํ™”์„ผํ„ฐ๋กœ ์ง„ํ–‰ํ•˜๊ณ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ(?) ์†Œ๋ชจ์ž„(?)์— ์ฐธ์—ฌ์ค‘์ธ๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ๋‘ ๊ฐœ์˜ ํด๋ก  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๊ฒน์นจ + ์•ฝ๊ฐ„์˜ ๋จธ๋ฆฌ์ •๋ฆฌ๊ฐ€ ์•ˆ๋จ + ์•ฝ๊ฐ„์˜ ๊ฒŒ์œผ๋ฆ„ ์œผ๋กœ ์—…๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์˜ค๋Š˜ ์‹œ์ž‘ํ•˜๋Š” toss ์•ฑ ํด๋ก ์ฝ”๋”ฉ์€ ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ์–ด๋ ค์›€์ด๋‚˜ ๊ณ ๋ฏผ๋“ค์„ ์ ์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


 ๐ŸŸฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ™์ด ์ง„ํ–‰ํ–ˆ๋˜ ๋ฉ˜ํ‹ฐ๋ถ„์ด ".gitignore"ํŒŒ์ผ๊ณผ "xcodeproj" ํด๋”๋Š” ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์žˆ์–ด์•ผ ์ข‹๋‹ค๊ณ  ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค. ์ž์„ธํ•œ ์ด์œ ๋Š”,,, ์ž˜ ๋ชป๋“ค์—ˆ์ง€๋งŒ (๋‹ค์‹œ ๋ฌผ์–ด๋ณด๊ณ  ์ ์–ด๋†“์ž!) ๋‚˜์ค‘์— ์ ‘๊ทผํ•˜๊ธฐ ํŽธํ•˜๋‹ค๋‚˜..? ์ด๋Ÿฐ์ด์œ ์˜€๋˜๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. 

์›๋ž˜ ํ‰์†Œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์—ˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์œ„์—์ฒ˜๋Ÿผ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค! 
(์•„๋ž˜์˜ ํŒŒ์ผ ๊ตฌ์กฐ๋Š” xcodeproj ํŒŒ์ผ์ด AppStoreClone ํด๋” ๋‚ด๋ถ€์— ์œ„์น˜ํ•œ๋‹ค.์ด๋ ‡๊ฒŒ depth๊ฐ€ ํ•˜๋‚˜ ๋” ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ์œ„์ฒ˜๋Ÿผ depth๊ฐ€ ํ•˜๋‚˜ ์ค„์–ด๋“  ๊ฒฝ๋กœ์„ค์ •์„ ์‹ค์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ ํ˜ธํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค!)

X ์ด๋ ‡๊ฒŒํ•˜์ง€๋ง๊ณ  ์œ„์—์ฒ˜๋Ÿผ ๋ ˆํฌ๋ฅผ ์ƒ์„ฑํ•˜์ž!

 

๐ŸŸฃ 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

 

[FEAT] Tab Bar UI๊ตฌํ˜„ · Issue #3 · DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown

๐Ÿ‘พ Describe the feature toss์˜ ๋ฉ”์ธ ํƒญ๋ฐ” UI๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘พ ์ฐธ๊ณ  ํ™”๋ฉด

github.com

 

๐Ÿ‘พ UINavigationController vs. UIViewController

TabBar๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ–ˆ๋‹ค. UITabBarController๋ฅผ ์ƒ์†๋ฐ›์•„์„œ, ๊ทธ ์•ˆ์— ํƒญ๋“ค์„ ๊ตฌํ˜„ํ• ๋•Œ ์–ด๋–ค ๊ฒƒ์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ฏผ์ด์—ˆ๋‹ค. ๋‘ ๊ฐœ์— ์–ด๋–ค ์ฐจ์ด์ ์ด ์กด์žฌํ•˜๋Š”์ง€ ์ •ํ™•ํ•œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์จ์•ผ ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

https://www.zehye.kr/ios/2020/03/13/iOS_vc_navigation_vc/

 

UINavigationController์™€ UIViewController ์ฐจ์ด์  · ์ง€ํ˜œ์˜ ๊ฐœ๋ฐœ๊ณต๋ถ€๋กœ๊ทธ

UINavigationController์™€ UIViewController ์ฐจ์ด์  13 Mar 2020 | iOS ๊ฐœ์ธ๊ณต๋ถ€ ํ›„ ์ž๋ฃŒ๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ž„์œผ๋กœ ๋‚ด์šฉ ์ƒ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NavigationController ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋œ content๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ

www.zehye.kr

๋‚ด๊ฐ€ ์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค์ด๋‹ค. ์ผ๋‹จ ์ด ๊ธ€์„ ์ดํ•ดํ•œ ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • 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

 

[iOS] TabBar Controller ๋งŒ๋“ค๊ธฐ (No StroyBoard)

์˜ค๋Š˜์€ ์•ฑ์—์„œ ์ž์ฃผ ๋ณด๋Š” ๋‹จ๊ณจ ํ™”๋ฉด TabBar Controller๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. TabBar Controller ๋Š” ํƒญ์œผ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ child๋กœ ์„ค์ •ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋‹ˆ๋‹ค. TabBar Controller์—๋Š” ๋ฃจํŠธ๋ทฐ์™€ ํƒญ

stickode.tistory.com

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์ด๋ผ๊ณ ํ•˜๋‚˜.. ์ด๋Ÿฐ๊ฑธ ์ดํ•ดํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฟŒ์‹œ์ž! ๐Ÿคœ๐Ÿป)

https://blog.naver.com/PostView.naver?blogId=soojin_2604&logNo=222437253619&parentCategoryNo=&categoryNo=64&viewDate=&isShowPopularPosts=false&from=postView 

 

[iOS] viewDidLayoutSubviews๋ž€? viewWillLayoutSubviews๋ž€?

๋ฒ„ํŠผ์„ ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๋ฒ„ํŠผ์˜ frame์„ viewDidLayoutSubviews์— ์„ค์ •์„ ํ•ด์ฃผ๋‹ค๊ฐ€ ๋ฌธ๋“.. ์™œ ์—ฌ๊ธฐ...

blog.naver.com

 

๐Ÿ‘พ 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

 

[ADD] Tabbar UI ๊ตฌํ˜„ by deslog · Pull Request #4 · DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown

๐Ÿ‘พ ๊ด€๋ จ์ด์Šˆ #3 ๐Ÿ‘พ ๊ตฌํ˜„,๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ ์ด์œ  UITabBarController๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. viewDidLayoutSubviews ๋ฅผ ์‚ฌ์šฉํ•ด์„œ tabbar์˜ ๋†’์ด๋ฅผ ์กฐ์ ˆํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. HomeVeiwController๋ฅผ ์ž„์‹œ๋กœ ์ƒ์„ฑํ•œ ํ›„, ํƒญ์ด

github.com

 

 

๋‹ค์Œ ํฌ์ŠคํŒ…์€ ์˜ค๋Š˜ ๊ฐ€์กŒ๋˜ ์˜๋ฌธ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…๊ณผ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฐ›์€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด๋‚˜๊ฐ€๋Š”์ง€ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค!

๋ฐ˜์‘ํ˜•