Twitterの様に左部からメニューを表示させたいと考えています。
奥行きを出して重ねるのではなく、左に存在していたViewをスライド表示するイメージです。
下記のサイトを参考にコードを書いたのですが、左側からスワイプしてもメニューが表示されません。
ただ、下側から上にスワイプすると期待通りに左部からメニューが表示されます。
なぜ、左からのスワイプではなく下からのスワイプ判定になっているのでしょうか。
おそらくMainViewが原因なのではないかなと思ってます。
▼ContentView
Swift
1import SwiftUI 2 3struct ContentView: View { 4 5 @State private var xOffset = CGFloat.zero 6 @State private var defaultOffset = CGFloat.zero 7 8 var body: some View { 9 GeometryReader { geometry in 10 ScrollView(.horizontal, showsIndicators: false) { 11 HStack(spacing: 0) { 12 SideMenuView() 13 .frame(width: geometry.size.width * 0.7) 14 Divider() 15 MainView() 16 .frame(width: geometry.size.width) 17 } 18 .onAppear(perform: { 19 self.xOffset = geometry.size.width * -0.7 20 self.defaultOffset = self.xOffset 21 }) 22 .offset(x: self.xOffset) 23 .frame(width: geometry.size.width, alignment: .leading) 24 .animation(.default) 25 .gesture( 26 DragGesture() 27 .onChanged{ value in 28 if (self.xOffset != .zero && value.translation.width > 5) { 29 self.xOffset = self.defaultOffset + value.translation.width 30 } 31 } 32 .onEnded { value in 33 if (value.translation.width > 5) { 34 self.xOffset = .zero 35 } else { 36 self.xOffset = self.defaultOffset 37 } 38 } 39 ) 40 } 41 .edgesIgnoringSafeArea(.all) 42 } 43 } 44} 45 46struct ContentView_Previews: PreviewProvider { 47 static var previews: some View { 48 ContentView() 49 } 50} 51
▼MainView
swift
1import SwiftUI 2 3struct MainView: View { 4 5 @State private var navBarTitle: String = "TOP" 6 @State private var isNewViewShown: Bool = false 7 8 var body: some View { 9 NavigationView(){ 10 TabView(selection: $navBarTitle){ 11 AView().tabItem{ 12 Label("aaa", systemImage: "house") 13 }.tag("aaa") 14 BView().tabItem{ 15 Label("bbb", systemImage: "antenna.radiowaves.left.and.right") 16 }.tag("bbbb") 17 CView().tabItem{ 18 Label("ccc", systemImage: "checkmark.square") 19 }.tag("ccc") 20 DView().tabItem{ 21 Label("ddd", systemImage: "text.bubble") 22 }.tag("ddd") 23 } 24 .navigationBarTitle(Text(self.navBarTitle), displayMode: .inline) 25 .navigationBarItems( 26 leading: 27 Button(action: { 28 print("通知ボタンが押されました。") 29 }, label: { 30 Image(systemName: "bell") 31 .renderingMode(.template) 32 .foregroundColor(.white) 33 }), 34 trailing: 35 Button(action: { 36 print("検索ボタンが押されました。") 37 }, label: { 38 Image(systemName: "magnifyingglass") 39 .renderingMode(.template) 40 .foregroundColor(.white) 41 }) 42 ) 43 .overlay( 44 Button(action: { 45 print("新規投稿ボタンが押されました。") 46 self.isNewPostViewShown = true 47 }, label: { 48 Image(systemName: "plus.circle") 49 .resizable() 50 .frame(width: 40.0, height: 40.0, alignment: .leading) 51 .background(Color.white) 52 .foregroundColor(.gray) 53 .clipShape(Circle()) 54 }) 55 .offset(x: 0, y: -30), alignment: .bottom 56 ) 57 .sheet(isPresented: self.$isNewViewShown){ 58 NewView() 59 } 60 } 61 } 62} 63 64struct MainView_Previews: PreviewProvider { 65 static var previews: some View { 66 MainView() 67 } 68} 69
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。