質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1783閲覧

【SwiftUI】画面右側から出てくるサイドメニューを実装したい

Jene

総合スコア13

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2021/09/05 06:16

前提・実現したいこと

こちらの記事(https://dev.classmethod.jp/articles/swiftui_overlay_sidemenu/)を参考にして右側から出てくるサイドメニューの実装を試みております。

発生している問題・エラーメッセージ

パラメータをいじって右側から出すことが出来たのですが、サイドメニュービューが停止する位置が左サイドになってしまいます(以下Gif参照)。
サイドメニューイメージ

該当のソースコード

Swift

1// メインコンテンツビュー 2struct TestView: View { 3 var body: some View { 4 Text("Hello, World!") 5 } 6} 7 8// サイドメニュー出現前ビュー 9struct SideView: View { 10 @State var isOpenSideMenu: Bool = false 11 var body: some View { 12 VStack{ 13 ZStack{ 14 NavigationView { 15 TestView() 16 .navigationBarItems(trailing: ( 17 Button(action: { 18 self.isOpenSideMenu.toggle() 19 }) { 20 Image(systemName: "line.horizontal.3") 21 .imageScale(.large) 22 })) 23 } 24 25 .navigationBarTitle("") 26 .navigationBarHidden(true) 27 28 29 SideMenuView(isOpen: $isOpenSideMenu) 30 .edgesIgnoringSafeArea(.all) 31 } 32 } 33 } 34} 35 36// サイドメニュー表示後ビュー 37struct SideMenuView: View { 38 @Binding var isOpen: Bool 39 let width: CGFloat = screenWidth 40 41 var body: some View { 42 ZStack { 43 GeometryReader { geometry in 44 EmptyView() 45 } 46 .background(Color.gray.opacity(0.3)) 47 .opacity(self.isOpen ? 1.0 : 0.0) 48 .opacity(1.0) 49 .animation(.easeIn(duration: 0.25)) 50 .onTapGesture { 51 self.isOpen = false 52 } 53 54 HStack { 55 VStack() { 56 SideMenuContentView(topPadding: 100, isOpen: $isOpen) 57 Spacer() 58 } 59 .frame(width: width*2/3) 60 .background(Color(UIColor.systemGray6)) 61 .offset(x: self.isOpen ? 0 : self.width) 62 .animation(.easeIn(duration: 0.25)) 63 Spacer() 64 } 65 } 66 } 67} 68 69// サイドメニューの内容を作成したビュー 70struct SideMenuContentView: View { 71 let topPadding: CGFloat 72 @Binding var isOpen: Bool 73 @State var test: Bool = false 74 init(topPadding: CGFloat = 30,isOpen: Binding<Bool>) { 75 self.topPadding = topPadding 76 self._isOpen = isOpen 77 } 78 79 var body: some View { 80 VStack { 81 Text("Test1") 82 .padding(.vertical) 83 .foregroundColor(.gray) 84 .font(.headline) 85 86 Text("Test2") 87 .padding(.vertical) 88 .foregroundColor(.gray) 89 .font(.headline) 90 91 Text("Test3") 92 .padding(.vertical) 93 .foregroundColor(.gray) 94 .font(.headline) 95 96 Spacer() 97 98 } 99 .padding(.top, topPadding) 100 .padding(.leading, 32) 101 .onTapGesture { 102 self.isOpen = false 103 104 } 105 } 106} 107

試したこと

サイドメニューに関する知識自体が足りていないので、調整箇所が分からない状況です。
知見がある方ご教授頂きたいです。

補足情報(FW/ツールのバージョンなど)

Xcode 12.5.1
iOS 14.0向け

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

投稿2021/09/12 01:26

Jene

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問