SwiftUI + Combine을 이용하여 Fleek Copy app 만들기(3-1)

이전 포스트에서 말한대로 오늘은 MainTabView 화면을 작성해보려고 합니다.

MainTabView는 메인 UI가 아닌, 하단 탭바를 말하며, MainTabView를 만들어 보려고 합니다.

KakaoTalk_Photo_2023-03-21-21-55-06.png

Fleek의 화면 중 파란 박스 영역을 만들어 보려고 합니다.

먼저 MainTabView의 SwiftUI View를 생성해 줍니다.

스크린샷 2023-03-21 오후 10.51.10.png

스크린샷 2023-03-21 오후 10.51.33.png

Tabbar를 이용하기 위해서는 Tabview라는 view를 사용합니다.

스크린샷 2023-03-21 오후 10.54.00.png

  • Document에 아주 명확하고 간단하게 잘 나타나 있는것 같습니다.
  • TabView라는 View안에, 노출되어야 할 View를 정해주고, tabItem을 통해 tabbarItem에서 나타낼 title과 image를 지정해주면 노출되는 형식입니다.

Fleek을 보면 총 5개의 tabItem이 있는것을 확인할 수 있습니다.

(요약, 캘린더, 루틴, 피드, 설정)

각각의 image들은 SF Symbols 를 이용하여 최대한 비슷한 것들을 찾아서 적용해 보았습니다.

import SwiftUI

enum TabbarItem: String {
    case stairs
    case calendar
    case dumbbell
    case magnifyingglass
    case gearshape
    
    var title: String {
        switch self {
        case .stairs :
            return "요약"
        case .calendar:
            return "캘린더"
        case .dumbbell:
            return "루틴"
        case.magnifyingglass:
            return "피드"
        case .gearshape:
            return "설정"
        }
    }
    
    var imageName: String {
        self.rawValue
    }
}

struct MainTabView: View {
    var body: some View {
        TabView {
            makeTabbar(.stairs, 0)
            makeTabbar(.calendar, 1)
            makeTabbar(.dumbbell, 2)
            makeTabbar(.magnifyingglass, 3)
            makeTabbar(.gearshape, 4)
        }
        .onAppear() {
            let appearence = UITabBarAppearance()
            appearence.backgroundColor = .black
            UITabBar.appearance().standardAppearance = appearence
        }
        .tint(.red)
    }
}

func makeTabbar(_ tabbar: TabbarItem, _ tag: Int) -> some View {
    MainView(title: tabbar.title)
        .tabItem {
            Label(tabbar.title, systemImage: tabbar.imageName)
        }.tag(tag)
}

struct MainTabView_Previews: PreviewProvider {
    static var previews: some View {
        MainTabView()
    }
}

swiftUI로 작성한 코드는 위와 같습니다.

  • TabView에 들어갈 TabItem들을 만들어주는 makeTabbar 메소드를 통해 5개의 tabItem을 생성해주도록 하였습니다.
  • TabItem의 label과 systemImage를 쉽게 사용하기 위해 TabbarItem이라는 열거형을 만들어 사용했습니다.
  • 뒤에서 나오겠지만 각 TabItem에 매칭되는 MainView라는 View도 테스트용으로 만들어 두었습니다.
  • TabView의 onAppear 내부에 보면 appearance의 속성을 변경해 주는 부분이 있는데, 이는 선택된 Tabitem을 제외한 나머지 tabItem들이 dim된듯한 느낌으로 노출되는것을 변경하기 위해 사용하였습니다.

appearance 미적용

appearance 미적용

apperance 적용

apperance 적용

  • tag기능은 차후에 tabItem중 선택된 tabItem을 지정해주기 위해 사용되어 질 예정입니다.

위에 말했던 MainView를 살펴보겠습니다.

import SwiftUI

struct MainView: View {
    var title: String
    var body: some View {
        GeometryReader { proxy in
            VStack {
                Spacer()
                Text(title)
                    .foregroundColor(.white)
                    .frame(minWidth: proxy.size.width, maxWidth: .infinity)
                Spacer()
            }
            
        }.background(.black)
            
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView(title:"preview")
    }
}

선택된 View가 어떤것인지, 나타내기 위해 임시로 생성한 뷰입니다.

  • 저번시간에 보았던 GeometryReader를 사용하여 화면에 꽉 채웠습니다.
  • Text사이에 Spacer()를 두어 위아래 여백을 채우고 Text가 Center에 오도록 하였습니다.
  • 해당 View의 backgroundColor를 black으로 정해두었습니다.

이제 다 끝났습니다.

오늘 만들어 본 mainTabView가 어떻게 동작하는지 확인해보겠습니다.

Simulator Screen Recording - iPhone 14 Pro - 2023-03-21 at 23.15.47.gif

잘 동작하는 것을 확인할 수 있습니다.

다음 포스트에서는 Intro화면이 종료된 후, 해당 mainTabView가 노출되도록 작업해 보도록 하겠습니다.

감사합니다.