diff --git a/TwitterSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/paku.xcuserdatad/UserInterfaceState.xcuserstate b/TwitterSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/paku.xcuserdatad/UserInterfaceState.xcuserstate index f878e1c..d75fea7 100644 Binary files a/TwitterSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/paku.xcuserdatad/UserInterfaceState.xcuserstate and b/TwitterSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/paku.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/Contents.json new file mode 100644 index 0000000..67d7c25 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "export-document.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/export-document.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/export-document.png new file mode 100644 index 0000000..01f3f82 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Ads.imageset/export-document.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Bookmarks.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Bookmarks.png new file mode 100644 index 0000000..e502376 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Bookmarks.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Contents.json new file mode 100644 index 0000000..bcdceba --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Bookmarks.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Bookmarks.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Contents.json new file mode 100644 index 0000000..92754fa --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Home.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Home.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Home.png new file mode 100644 index 0000000..9204ceb Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Home.imageset/Home.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Contents.json new file mode 100644 index 0000000..0c57e11 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Light.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Light.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Light.png new file mode 100644 index 0000000..cbf4487 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Light.imageset/Light.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Contents.json new file mode 100644 index 0000000..fcbf3f5 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Lists.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Lists.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Lists.png new file mode 100644 index 0000000..7448ec3 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Lists.imageset/Lists.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Contents.json new file mode 100644 index 0000000..1f8162a --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Logo.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Logo.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Logo.png new file mode 100644 index 0000000..7624e0c Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Logo.imageset/Logo.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Contents.json new file mode 100644 index 0000000..8d08b0d --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Message.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Message.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Message.png new file mode 100644 index 0000000..64bd447 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Message.imageset/Message.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Contents.json new file mode 100644 index 0000000..4bfaf13 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Moments.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Moments.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Moments.png new file mode 100644 index 0000000..18174b4 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Moments.imageset/Moments.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/Contents.json new file mode 100644 index 0000000..bbc9738 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "monetization.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/monetization.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/monetization.png new file mode 100644 index 0000000..9895009 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Monetization.imageset/monetization.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Contents.json new file mode 100644 index 0000000..a77ffe9 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Notifications.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Notifications.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Notifications.png new file mode 100644 index 0000000..d1e310b Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Notifications.imageset/Notifications.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Contents.json new file mode 100644 index 0000000..6eea7c1 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Profile.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Profile.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Profile.png new file mode 100644 index 0000000..1fe4d09 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Profile.imageset/Profile.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/Contents.json new file mode 100644 index 0000000..32b435b --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "shopping-cart.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/shopping-cart.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/shopping-cart.png new file mode 100644 index 0000000..04339ed Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Purchases.imageset/shopping-cart.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/Contents.json new file mode 100644 index 0000000..f9c5007 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "QR.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/QR.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/QR.png new file mode 100644 index 0000000..435ff3c Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/QR.imageset/QR.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Contents.json new file mode 100644 index 0000000..5b0b3bd --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Search.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Search.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Search.png new file mode 100644 index 0000000..3906c58 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Search.imageset/Search.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Contents.json new file mode 100644 index 0000000..894eb09 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Sparkles.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Sparkles.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Sparkles.png new file mode 100644 index 0000000..dcafd11 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Sparkles.imageset/Sparkles.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Contents.json new file mode 100644 index 0000000..839cef7 --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Topics.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Topics.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Topics.png new file mode 100644 index 0000000..94c2460 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/Topics.imageset/Topics.png differ diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/Contents.json b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/Contents.json new file mode 100644 index 0000000..7aae5fc --- /dev/null +++ b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "xlogo.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/xlogo.png b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/xlogo.png new file mode 100644 index 0000000..48631d7 Binary files /dev/null and b/TwitterSwiftUI/Assets.xcassets/Twitter Icon Set/xlogo.imageset/xlogo.png differ diff --git a/TwitterSwiftUI/Core/Components/PagerTabView.swift b/TwitterSwiftUI/Core/Components/PagerTabView.swift index 5dd04c6..e408825 100644 --- a/TwitterSwiftUI/Core/Components/PagerTabView.swift +++ b/TwitterSwiftUI/Core/Components/PagerTabView.swift @@ -21,6 +21,7 @@ struct PagerTabView: View { @Binding var selectedTab: Int + init(selected: Binding, tabs: [Tab], @ViewBuilder content: @escaping () -> Content) { @@ -52,6 +53,8 @@ struct PagerTabView: View { } } .onChange(of: offset) { _ in + + // SwipeでPagingする時のみ、UnderlineViewを移動させる if isScrolling { underlineViewOffset = offset / CGFloat(tabs.count) @@ -161,9 +164,7 @@ fileprivate struct OffsetPageTabView: UIViewRepresentable { scrollView.isPagingEnabled = true scrollView.showsVerticalScrollIndicator = false scrollView.showsHorizontalScrollIndicator = false - scrollView.delegate = context.coordinator - return scrollView } @@ -188,7 +189,8 @@ extension OffsetPageTabView { } func scrollViewDidScroll(_ scrollView: UIScrollView) { - parent.offset = scrollView.contentOffset.x + let offsetX = scrollView.contentOffset.x + parent.offset = offsetX parent.isScrolling = (scrollView.isDragging || scrollView.isTracking || scrollView.isDecelerating) } diff --git a/TwitterSwiftUI/Core/FeedView.swift b/TwitterSwiftUI/Core/FeedView.swift index 510b038..4b828bf 100644 --- a/TwitterSwiftUI/Core/FeedView.swift +++ b/TwitterSwiftUI/Core/FeedView.swift @@ -22,38 +22,23 @@ struct FeedView: View { headerView - ZStack(alignment: .bottomTrailing) { - - PagerTabView(selected: $viewModel.currentTab, tabs: - [ - TabLabel(type: .recommend), - TabLabel(type: .following), - ]) { - ForEach(FeedTabFilter.allCases) { type in - FeedTabListView() - .environmentObject(self.viewModel) - .frame(width: UIScreen.main.bounds.width) - } - } - .refreshable { - Task { - try await viewModel.fetchTweets() - } - } - Button { - showNewTweetView.toggle() - } label: { - Image(systemName: "square.and.pencil") - .font(.title2) - .foregroundColor(.white) + PagerTabView( + selected: $viewModel.currentTab, tabs: + [ + TabLabel(type: .recommend), + TabLabel(type: .following), + ] + ) { + ForEach(FeedTabFilter.allCases) { type in + FeedTabListView() + .environmentObject(self.viewModel) + .frame(width: UIScreen.main.bounds.width) + } + } + .refreshable { + Task { + try await viewModel.fetchTweets() } - .background( - Circle() - .fill(Color(.systemBlue)) - .frame(width: 54, height: 54) - ) - .padding(.trailing, 32) - .padding(.bottom, 32) } } .toolbar(.hidden, for: .navigationBar) diff --git a/TwitterSwiftUI/Core/TabBar/MainTab/MainTabView.swift b/TwitterSwiftUI/Core/TabBar/MainTab/MainTabView.swift index b8c2837..d055124 100644 --- a/TwitterSwiftUI/Core/TabBar/MainTab/MainTabView.swift +++ b/TwitterSwiftUI/Core/TabBar/MainTab/MainTabView.swift @@ -14,63 +14,84 @@ struct MainTabView: View { @State private var selectedIndex: Int = 0 private let sideBarWidth = UIScreen.main.bounds.width - 90 - + @State private var offset: CGFloat = 0 @State private var lastStoredOffset: CGFloat = 0 @GestureState private var gestureOffset: CGFloat = 0 - + + init() { + // カスタムTabBarを使うため、default tabBarを隠す + UITabBar.appearance().isHidden = true + } + var body: some View { HStack(spacing: 0) { SideMenuView(showSideMenu: $showSideMenu) - TabView(selection: $selectedIndex) { - - FeedView(showSideMenu: $showSideMenu) - .onTapGesture { - self.selectedIndex = 0 - } - .tabItem { - Image(systemName: "house") - } - .tag(0) - - ExploreView() - .onTapGesture { - self.selectedIndex = 1 - } - .tabItem { - Image(systemName: "magnifyingglass") - } - .tag(1) + ZStack(alignment: .bottomTrailing) { - NotificationsView() - .onTapGesture { - self.selectedIndex = 2 + VStack(spacing: 0) { + TabView(selection: $selectedIndex) { + + FeedView(showSideMenu: $showSideMenu) + .tag(0) + + ExploreView() + .tag(1) + + NotificationsView() + .tag(2) + + ConversationsView() + .tag(3) } - .tabItem { - Image(systemName: "bell") + + VStack(spacing: 0) { + + Divider() + + // CustomTabBar + HStack(spacing: 0) { + TabButton(image: "Home", tag: 0) + + TabButton(image: "Search", tag: 1) + + TabButton(image: "Notifications", tag: 2) + + TabButton(image: "Message", tag: 3) + } + .padding(.top, 15) + .padding(.bottom, 10) + .background(Color.black.opacity(0.03)) // 確認のため背景をかける } - .tag(2) + } + .overlay( + Color.black // ( 1 or 0 ) / 5 = 1の場合 opacityは 0.2 + .opacity( (offset / sideBarWidth) / 5.0 ) + .ignoresSafeArea() + .onTapGesture { + showSideMenu = false + } + ) - ConversationsView() - .onTapGesture { - self.selectedIndex = 3 - } - .tabItem { - Image(systemName: "envelope") - } - .tag(3) + Button { + // showNewTweetView.toggle() + } label: { + Image(systemName: "square.and.pencil") + .font(.title2) + .foregroundColor(.white) + } + .background( + Circle() + .fill(Color(.systemBlue)) + .frame(width: 54, height: 54) + ) + .padding(.trailing, 36) + .padding(.bottom, 70) } - .overlay( - Color.black // ( 1 or 0 ) / 5 = 1の場合 opacityは 0.2 - .opacity( (offset / sideBarWidth) / 5.0 ) - .ignoresSafeArea() - .onTapGesture { - showSideMenu = false - } - ) + } .animation(.easeInOut(duration: 0.2), value: offset == 0) // サイドメニューとMainViewが同時に移動するため @@ -88,12 +109,13 @@ struct MainTabView: View { offset = 0 lastStoredOffset = 0 } - + } .onChange(of: gestureOffset) { _ in + if gestureOffset != 0 { - + // Draggingしたwidthが SideBarWidth以内の場合 if gestureOffset + lastStoredOffset < sideBarWidth && (gestureOffset + lastStoredOffset) > 0 { @@ -114,7 +136,7 @@ struct MainTabView: View { out = value.translation.width }) .onEnded({ value in - + withAnimation(.spring(duration: 0.15)) { if value.translation.width > 0 { @@ -123,12 +145,11 @@ struct MainTabView: View { // 指を離した位置が sideBarWidthの半分を超えた場合 // (注意: valueは draggingにより 0から始まる if value.translation.width > sideBarWidth / 2 { - + offset = sideBarWidth lastStoredOffset = sideBarWidth showSideMenu = true } else { - // sideMenuが開いている状態で右端の方にdraggingした際には誤って閉じないように回避させる if value.translation.width > sideBarWidth && showSideMenu { offset = 0 @@ -156,7 +177,7 @@ struct MainTabView: View { // sideMenuが閉じている状態で左の方にDraggingする場合には // この処理を回避させる - guard showSideMenu else { + guard showSideMenu else { return } // 指を離した位置が半分以下でも <<<左のDragging加速度が早ければ sideMenuを閉じる @@ -167,15 +188,31 @@ struct MainTabView: View { offset = sideBarWidth showSideMenu = true } - } } } - + lastStoredOffset = offset }) ) } + + @ViewBuilder + func TabButton(image: String, tag: Int) -> some View { + Button { + withAnimation { + selectedIndex = tag + } + } label: { + Image(image) + .resizable() + .renderingMode(.template) + .aspectRatio(contentMode: .fit) + .frame(width: 23, height: 23) + .foregroundColor(selectedIndex == tag ? .primary : .gray) + .frame(maxWidth: .infinity) + } + } } #Preview {