2021/02/01
[SwiftUI]NeumorphicなカスタムTabbarを作成しました
実施内容
Neumorphismな見た目のカスタムTabviewを実装しました。
以下のような感じになりました。

実装内容
TabItem
- 一つのTabに当たるComponent
import SwiftUI
import Neumorphic
struct TabItem<Tab>: View where Tab: Equatable {
    let image: Image
    let tab: Tab
    var mainColor: Color = Neumorphic.shared.mainColor()
    var darkShadowColor: Color = Neumorphic.shared.darkShadowColor()
    var lightShadowColor: Color = Neumorphic.shared.lightShadowColor()
    @Binding var selected: Tab
    
    var body: some View {
        if tab == selected {
            VStack {
                image.imageScale(.large)
                    .foregroundColor(.primary)
            }
            .frame(width: 20, height: 20)
            .padding()
            .background(
                RoundedRectangle(cornerRadius: 10)
                        .fill(mainColor)
                        .softInnerShadow(
                            RoundedRectangle(cornerRadius: 10),
                            darkShadow: darkShadowColor,
                            lightShadow: lightShadowColor,
                            spread: 0.05,
                            radius: 2
                        )
            )
        } else {
            VStack {
                image.imageScale(.large)
                    .foregroundColor(.textInactive)
            }
            .frame(width: 20, height: 20)
            .padding()
            .background(
                RoundedRectangle(cornerRadius: 10)
                    .fill(mainColor)
                    .softOuterShadow()
            )
            .onTapGesture {
                selected = tab
            }
        }
    }
}
MainView
- メイン画面
import SwiftUI
import Neumorphic
struct MainView: View {
    
    @State var selectedTab = Tab.home
    
    enum Tab: Int {
        case home, tasks, calendar, settings
    }
    
    var body: some View {
        ZStack {
            Neumorphic.shared.mainColor().ignoresSafeArea()
            TabView(selection: $selectedTab) {
                HomeView().tag(Tab.home)
                TasksView().tag(Tab.tasks)
                CalendarView().tag(Tab.calendar)
                SettingsView().tag(Tab.settings)
            }
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
            VStack {
                Spacer(minLength: 0)
                if (selectedTab != Tab.settings) {
                    // floating button
                    HStack {
                        Spacer()
                        VStack {
                            Spacer()
                            IconButton(
                                action: {},
                                image: Image(systemName: "plus")
                            )
                            .padding(EdgeInsets(top: 0, leading: 0, bottom: 16.0, trailing: 16.0))
                        }
                    }
                }
                HStack(spacing: 0) {
                    Spacer()
                    TabItem(
                        image: Image(systemName: "house"),
                        tab: Tab.home,
                        selected: $selectedTab
                    )
                    Spacer()
                    TabItem(
                        image: Image(systemName: "list.bullet"),
                        tab: Tab.tasks,
                        selected: $selectedTab
                    )
                    Spacer()
                    TabItem(
                        image: Image(systemName: "calendar"),
                        tab: Tab.calendar,
                        selected: $selectedTab
                    )
                    Spacer()
                    TabItem(
                        image: Image(systemName: "gearshape"),
                        tab: Tab.settings,
                        selected: $selectedTab
                    )
                    Spacer()
                }
                .padding(.top, 8)
                .padding(.horizontal, 8)
                .background(
                    RoundedRectangle(cornerRadius: 5).fill(Neumorphic.shared.mainColor())
                )
            }
        }
    }
}
以上です。
作業記録・備忘録でした。
関連する記事

SwiftUIを使った開発のノウハウをまとめたiOSアプリをリリースしました
Kumanoteでよく使うSwiftUIコンポーネントの作り方をソースコードと共に公開しています。

SwiftUIでswiftのコードのシンタックスハイライトを表示する
SwiftのコードをSwiftUIベースのアプリでシンタックスハイライトされた状態で見れるViewを作ってみました

Tailwindcssで定義されている色からSwiftUI版の定義を自動生成する
Tailwindcssで定義されている便利な色たちをSwiftUIアプリでも利用したいので、jsonで定義されている色をSwiftUI Colorsの変数に変換するスクリプトを作りました

[SwiftUI]Lottieファイルを使ってSplash画面をつくる
Lottieファイルを使ってSwiftUIアプリのSplash画面を作成しました
