์๋
ํ์ธ์ Foma ๐ป ์
๋๋ค!
์ค๋์ SwiftUI์์ ํญ๋ทฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
(UIKit์์ UITabBar๋ฅผ ๋ปํฉ๋๋ค.)
๋ฐ๋ก ์์ํ ๊ฒ์~
TabView Contents
SwiftUI์์ ํญ๋ทฐ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ฌด ๋๋ฌด ๊ฐ๋จํฉ๋๋ค.
์๋์ ๊ฐ์ด TabView๋ก ๊ฐ์ธ๊ณ ํญ๋ทฐ ์์ ๋ค์ด๊ฐ ๋ทฐ๋ค์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
TabView {
View1()
View2()
View3()
...
}
TabView Item
ํ์ง๋ง ์๋์ ๊ฐ์ด ์ค์ ํ๋ฉด ์์ง ํญ๋ทฐ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ฐ์.
TabView {
LoginView()
HelloView()
SettingView()
}
์ด์ ๋ ์ด๋ฏธ ํญ๋ทฐ๊ฐ ์กด์ฌํ์ง๋ง ํญ๋ทฐ๋ฅผ ๋ํ๋ด๋ ์์ดํ
์ ์ธํ
ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ณ ๋ก ๋ค์๊ณผ ๊ฐ์ด ํญ์์ดํ
์ ํ
์คํธ์ ์ด๋ฏธ์ง๋ฅผ ์ธํ
ํด์ฃผ์
์ผ ํฉ๋๋ค.
TabView {
LoginView()
.tabItem({
Image(systemName: "arrow.right.circle.fill")
Text("Login")
})
HelloView()
.tabItem {
Image(systemName: "person.crop.circle")
Text("Hello")
}
SettingView()
.tabItem {
Image(systemName: "gearshape")
Text("Setting")
}
}
์ธํ
ํด์ฃผ๋ฉด ์๋์ ๊ฐ์ด ํญ๋ทฐ๊ฐ ์ ์์ ์ผ๋ก ์ธํ
๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Selection
ํญ๋ทฐ์ ํน์ ์์ดํ
์ ๋๋ ์ ๋ ํ์ธํ ์ ์๋ ์์ฑ์๋ก selection์ด ์๋๋ฐ์.
๊ณต์ ๋ฌธ์๋ฅผ ํ์ธํ๋ฉด ์๋์ ๊ฐ์ด ๋ฐ์ธ๋ฉ์ ํด์ผ ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ํ ๊ฐ View์๋ tag๋ฅผ ๋ฌ ์ ์๋๋ฐ์.
์ด ํ๊ทธ์ selection์ ์ด์ฉํด ๋ช ๋ฒ์งธ ํญ์์ดํ
์ด ์ ํ๋์๋์ง ์ ์ ์์ต๋๋ค.
selection์ Binding ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์ ์ฉํด์ผ ํ๊ฒ ์ฃ ?
@State ๋ณ์๋ก ๊ฐ ๋ทฐ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํด์ค๋๋ค.
@State var index = 0
var body: some View {
TabView(selection:$index) {
LoginView()
.tabItem({
Image(systemName: "arrow.right.circle.fill")
Text("Login")
})
.tag(0)
HelloView()
.tabItem {
Image(systemName: "person.crop.circle")
Text("Hello")
}
.tag(1)
SettingView()
.tabItem {
Image(systemName: "gearshape")
Text("Setting")
}.tag(3)
}
ํญ๋ทฐ์ ์์ดํ
์ ๋๋ฅด๋ฉด ์๋์ ๊ฐ์ด ์์ดํ
์ธ๋ฑ์ค์ ๋ง๊ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
๋ค๋ฅธ View์์ ํญ๋ทฐ ์ธ๋ฑ์ค ์ ๊ทผํ๊ธฐ
๋ง์ฝ ์์ํ๋ ๋ทฐ์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธ ํ๋ฉดํญ์ ์์์ผ๋ก,
ํฌ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด ํฌ๋ก ํ๋ฉดํญ์ ์์์ผ๋ก ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๋น์ฐํ ํญ๋ทฐ๋ก ์ด๋ํ ๋ ์ด๋ ํ ๊ฐ์ ํญ๋ทฐ ํ๋ฉด์ ์ ๋ฌํด ์ค์ผ๊ฒ ์ฃ ?
๋ฐฉ๋ฒ์ ํ๋ฉด ์ด๋ ์์ ํญ๋ทฐ ํ๋ฉด์ ์๋ @State var index ๋ณ์๋ฅผ ์ ๋ฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
NavigationLink(destination: TabViewTest(index: 0)) {
Text("Go LoginView")
}
NavigationLink(destination: TabViewTest(index: 1)) {
Text("Go HelloView")
}
ํญ๋ทฐ ์ ์์ดํ ์์ ๋ค๋ฅธ ํญ๋ทฐ ์ธ๋ฑ์ค๋ก ์ด๋ํ๊ธฐ
๊ฐ ๋ทฐ์ ๋ค์ ํ๋ฉด์ ์ธ๋ฑ์ค๋ฅผ ๋ด์ @Binding ๋ณ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ๋ฒํผ์ ๋๋ฅด๋ฉด ์ํ๋ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํด์ฃผ๋๋ก ํฉ๋๋ค.
struct LoginView: View {
@Binding var goIndex:Int
var body: some View {
Button("Go Seting") {
self.goIndex = 2
}
}
}
struct HelloView: View {
@Binding var goIndex:Int
var body: some View {
Button("Go Login") {
self.goIndex = 0
}
}
}
struct SettingView: View {
@Binding var goIndex:Int
var body: some View {
Button("Go Hello") {
self.goIndex = 1
}
}
}
ํญ๋ทฐ๊ฐ ์๋ ๋ทฐ๋ก ์ด๋ํด์ ๊ฐ ๋ทฐ์ goIndex๋ฅผ @State๋ก ๋ฐ์ธ๋ฉ ํด์ค๋๋ค.
TabView(selection:selection) {
LoginView(goIndex:$index)
.tabItem({
Image(systemName: "arrow.right.circle.fill")
Text("Login")
}).tag(0)
HelloView(goIndex:$index)
.tabItem {
Image(systemName: "person.crop.circle")
Text("Hello")
}.tag(1)
SettingView(goIndex:$index)
.tabItem {
Image(systemName: "gearshape")
Text("Setting")
}.tag(2)
}
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์์ดํ
์์ ๋ค๋ฅธ ํญ ์ธ๋ฑ์ค๋ก ์ด๋ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ก์ผํธ ์ปฌ๋ฌ ๋ฐ๊พธ๊ธฐ
TabView(selection:selection) {
...
}
.accentColor(.purple)
์ก์ผํธ ์ปฌ๋ฌ๋ฅผ ์ค์ ํด์ฃผ๋ฉด ํญ๋ทฐ ์ ์์ดํ
์ ์ ๋ฟ๋ง ์๋๋ผ ํญ๋ทฐ ์์ ์๋ ๋ทฐ์ ๋ฒํผ ์ ๋ฑ๋ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
ํญ๋ทฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ๊พธ๊ธฐ
TabView(selection:selection) {
...
}
.accentColor(.purple)
.onAppear {
UITabBar.appearance().backgroundColor = .black
}
onAppear ๋ฉ์๋์ UIKit์ ์ด์ฉํ์ฌ ํญ๋ทฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ ํ๋์ง ์์ ํญ๋ทฐ ์์ดํ ์ ๋ฐ๊พธ๊ธฐ
์ ํ๋ฉด์์ ๋ฐฐ๊ฒฝ์์ ๋ฐ๊พธ๋ ๋ค๋ฅธ ์์ดํ
์์ด์ฝ์ด ์ ์๋ณด์ด์ฃ ?
์ ํ๋์ง ์์ ์์ดํ
์ ์์ด ์ ๋ณด์ด๋๋ก ์ค์ ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์ด๊ฒ ๋ํ UIKit์ UITabBar๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋์ง ์์ ์์ดํ
์ ํดํธ์ปฌ๋ฌ๋ฅผ ์ค์ ํด์ค๋๋ค.
init() {
UITabBar.appearance().unselectedItemTintColor = UIColor.white
}
์ค๋์ ์ด๋ ๊ฒ SwiftUI์ ํญ๋ทฐ์ ๋ํด์ ์์ ๋ณด์๋๋ฐ์.
์๊ฐ๋ณด๋ค ํญ๋ทฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด UIKit์ ๋นํด ์ฝ๊ณ ๊ฐ๋จํด์ ๋๋์ต๋๋ค.
๋ํ SwiftUI๋ฅผ ์ ๋ค๋ฃจ๊ธฐ ์ํด์ UIKit์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์์์ผ ๋ ๋ํ
์ผํ ๋ถ๋ถ์ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ๋ ์๊ฒ ๋์์ต๋๋ค.
ํน์๋ผ๋ ํ๋ฆฐ ์ ์ด๋ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๋๊ธ