SwiftUI 半分サイズのモーダルシート PartialSheet

iOSのアプリでよく見かける画面サイズの半分ぐらいで下から出てくるモーダルシートですが、SwiftUIでどのように実装するのか標準のsheetでは思った挙動ではないようなので、調べてみるとPartialSheetを使うと実現できました。

PartialSheetは下のURL(GitHub)です。

https://github.com/AndreaMiotto/PartialSheet

XcodeのAccounts画面でGitHub登録し、メニュー[File|Swift Packages|Add Package Dependency…]を選択しダイアログからPartialSheetを使いたいProjectを選びます。

Choose Package Repository]画面検索用フィールドに「PartialSheet」と入力します。

Next]ボタンを押すとProjectに追加されます。

ソースコードに「import PartialSheet」すると使うことができます。@EnvironmentObjectPartialSheetManagerを設定しないといけない。

@EnvironmentObject var partialSheetManager: PartialSheetManager

半モーダルシートはどこかのActionで下記のように記述します。

self.partialSheetManager.showPartialSheet(content: {
	VStack {
		Text("")
	}.frame(height: 120)
})

PartialSheetは、NavigationViewの中でないと思ったような動きをしてくれませんでした。

NavigationView{
}.addPartialSheet()

NavigationViewに.addPartialSheet()を設定します。ためしたコード全体は下記のような感じです。

import PartialSheet

class TComponent : ObservableObject {
    @Published var textValue : String = "Show HalfSheet"
    static func resourcesLoadImage(name: String) -> CGImage {
        guard
            let url = Bundle.main.url(forResource: name, withExtension: "png"),
            let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
            let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
        else {
            fatalError("Couldn't load image \(name) .")
        }
        return image
    }
}

struct HalfSheet: View {
    @EnvironmentObject var Component1: TComponent
    @EnvironmentObject var partialSheetManager: PartialSheetManager

    var body: some View {
        NavigationView{
            VStack {
                Text(self.Component1.textValue)
                Button("初代", action: {
                    self.Component1.textValue = "初代"
                    self.partialSheetManager.showPartialSheet(content: {
                        VStack {
                            Image(TComponent.resourcesLoadImage(name: "shodai"), scale: 3, label: Text("") ).clipShape(Circle())
                                .overlay(Circle().stroke(Color.red, lineWidth: 4))
                            Text("ウルトラマン")
                        }.frame(height: 120)
                    })
                })
                Button("帰ってきた", action: {
                    self.Component1.textValue = "ジャック"
                    self.partialSheetManager.showPartialSheet(content: {
                        VStack {
                            Image(TComponent.resourcesLoadImage(name: "shinman"), scale: 2, label: Text("") ).clipShape(Circle())
                                .overlay(Circle().stroke(Color.blue, lineWidth: 4))
                            Text("ジャック")
                        }.frame(height: 200)
                    })
                })
            }
        }.addPartialSheet()
    }
}

上記コードでは、2つshowPartialSheet()を作っています。Imageは少し面倒なコードを書いていますがResourcesディレクトリにPNGファイルを入れていたためです。

Assets.xcassetsに画像を入れた場合は、Image(“shodai”)でOKです。

struct HalfSheet_Previews: PreviewProvider {
    static var previews: some View {
        HalfSheet().environmentObject(TComponent()).environmentObject(PartialSheetManager())
    }
}

Viewを使う場合.environmentObject()を2つ設定すればうまく動きました。

Xcode GitHubアカウント追加

Xcodeのアカウント設定に[Source Control Accounts]という項目がありGitHubが設定できます。メニュー[Xcode|Preference…]から[Accounts]画面を開きます。画面左には[Apple IDs]に自分のApple IDが登録されているかと思います。画面の左下に[+]ボタンがついているので [+]ボタンを選択[Select the type of Account you would like to add:]画面リストをスクロールすると[GitHub]が出てきますので[Continue]します。

上のような[Sign in to your GitHub Account]ダイアログが出ます。AccountとTokenを入れるのですがここに入れるトークンは、GitHub側で設定します。設定方法の詳細は、下記URL(doc.github.com)に書いています。

https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token

ブラウザからGitHubにログイン後、右上の自分のアイコン部分をクリックすると下のようなメニューが縦に出てきます。

Settings]をクリックするとセッティング画面に切り替わります。

https://github.com/settings/profile

画面左側にメニューリストが縦で出ています。その中の、下のほうに[Developer settings]があるので選択します。

GitHub AppsOAuth AppsPersonal access tokens]3つの項目があるので「Personal access tokens」を選択します。

Personal access tokens]画面の右側に[Generate new token]ボタンがあるのでクリックしますと、「New personal access token」画面に切り替わります。

Note]に解りやすい名前を入れておいて、[Select scopes]で必要な項目にチェックします。入力が終わったら下のほうに[Generate token]をクリックします。

画面が切り替わり、下のようにトークンが表示されいます。

このトークンと自分のGitHubアカウントを、Xcodeの[AccountsSelect the type of Account you would like to add:]画面[GitHub]で選択した[Sign in to your GitHub Account]ダイアログのAccountとToken項目に入力します。

Sign in]ボタンをクリックし成功すると下のように[Accounts]項目に追加されていることが確認できます。

XcodeGitHubアカウント追加できるとXcodeメニューの[FileSwift PackagesAdd Package Dependency…]でダイアログが出るので、そこでProjectを選択

Next]すると下のようなPackageリストが表示されます。

GitHubから様々なPackageダウンロードし利用することもできるようになります。

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED