HELP ビューの作成

アプリ本体からHELPボタンを押すとHELP画面が表示されて、戻るボタンを押すと元に戻るというのを作ってみる。

File>New>File... から SwiftUI VIEW を選んで、ファイル名はHelpView(別になんでもいい)

できたファイルをこんなふうにしてみる

import SwiftUI

 

struct HelpView: View {

    @Binding var helpFlg : Bool

    

    let helpText = """

HELPのテキスト

いっぱい書いて

横にどれだけ広がってくれるのかを試すために長い文章を書いてみる。

 

おこう

"""

    

    var body: some View {

        ZStack {

            Color.white

            VStack {

                Text("HELP").font(.headline)

                ScrollView {

                    Text(helpText)

                }

                Spacer()

                Button(" ←戻る "){

                    self.helpFlg = false

                }

                .padding(5)

                .background(Color.gray)

                    .foregroundColor(.white)

                .clipShape(Capsule())

                .frame(maxWidth: .infinity, alignment: .topLeading)

 

            }

        }

    }

}

 

いっぱい盛り込んだ。

@Binding var helpFlg : Bool

これは親のVIEWでhelpflgがtrueならこのビューを表示し、このビューでボタンを押すと親ビューで表示を消すための変数。

 

    let helpText = """

HELPのテキスト

いっぱい書いて

横にどれだけ広がってくれるのかを試すために長い文章を書いてみる。

 

おこう

"""

 

HELPに表示するテキストを """   """ ダブルコーテーション3つで囲むとテキスト内の改行も許される。このテキストは実行中に変更されることはないので let で宣言。

        ZStack {

            Color.white

            VStack {

 

Color.white は白で塗りつぶし。これをZStackで以下のViewと重ね書きする。

塗りつぶしておかないと、親VIEWの画像と重なってしまう。

                Text("HELP").font(.headline)

                ScrollView {

                    Text(helpText)

                }

最初のTextはタイトル表示。フォントも指定している。

その次、ScrollView はテキストが長かったときに画面スワイプでスクロールしてくれる。

そしてText(helpText) で実際のテキストを表示。

                Spacer()

                Button(" ←戻る "){

                    self.helpFlg = false

                }

                .padding(5)

                .background(Color.gray)

                    .foregroundColor(.white)

                .clipShape(Capsule())

                .frame(maxWidth: .infinity, alignment: .topLeading)

 Spacer() を置いて、ボタンが一番下に表示されるよう

                Button(" ←戻る "){

                    self.helpFlg = false

                }

 

ボタンとしてテキストを使っているのだけど、そこに表示されるテキストと、

ボタンを押した時のアクション。helpFlagをfalseにしてるだけ。

その下に続くのはボタンの装飾

.padding(5)

これがないとテキストギリギリに枠ができる。数値で隙間調整。

.background(Color.gray)

背景色指定。

.foregroundColor(.white)

文字色指定

.clipShape(Capsule())

文字を囲む枠の設定

.frame(maxWidth: .infinity, alignment: .topLeading)

ボタンを画面の左に表示するという設定。topは与えられた枠の上部、Leadingは左詰め。

Spacerで下詰めにしているから、 .leading でもよかった。

 

で、Viewをこんなふうに作ると、PreViewで HelpFlg がないよ〜というエラーになる。

@State var helpflg = true

で変数を宣言してやればいいのだけれど、PreViewで変数を宣言するとこれまた怒られる。

PreViewなんていらないなら、

// HelpView()

Text("HELP VIEW")

として誤魔化すのが簡単。

でも、やっぱりプレビューも見たいよねってときは、

struct helpWrap: View {

    @State var helpflg = true

    var body: some View{

        HelpView(helpFlg: $helpflg)

    }

}

とやって、HelpViewを呼び出すビューを作っておいて、

struct HelpView_Previews: PreviewProvider {

    static var previews: some View {

//        HelpView()

        helpWrap()

    }

}

プレビューからはこっちを呼び出す。

 

親ビューからHelpView w呼び出すときも

    @State var helpflg = true

の宣言と、

HelpView(helpFlg: $helpflg)

のように引数指定が必要。

 

親ビューに表示するボタンは

          Button(" HELP "){

                    self.helpflg = true

                }

                .padding(5)

                .background(Color.gray)

                    .foregroundColor(.white)

                .clipShape(Capsule())

                .frame(maxWidth: .infinity, alignment: .topLeading)

戻るボタンと同じところに表示しておくと、わかりやすいかも。