100 Days of SwiftUI(DAY 62(Project13 part 1))

nstafilter:はじめに
Instafilter: Introduction

Appleのフレームワークの多くの部分にはまだSwiftUIラッパーがありません。つまり、MapKit、Safari、またはその他の重要なAPIを統合する場合は、 SwiftUIで使用するコードをラップする方法を知る。正直に言うと、この作業を行うために必要なコードはきれいではありませんが、この時点では、SwiftUIのキャリアの中で、準備は整っています。

No console output from Xcode 11 / iOS 13
Xcode 11 / iOS 13からのコンソール出力なし

以下により解決!!
No console output from Xcode 11 / iOS 13

プロパティラッパーが構造体になる方法
How property wrappers become structs

struct ContentView: View {
   @State private var blurAmount: CGFloat = 0 {
        didSet {
            print("New value is \(blurAmount)")
        }
    }
    var body: some View {
        VStack {
            Text("Hello, World!")
                .blur(radius: blurAmount)

            Slider(value: $blurAmount, in: 0...20)
        }
    }
}

SwiftUIでカスタムバインディングを作成する
Creating custom bindings in SwiftUI

これを修正するには、カスタムバインディングを作成する必要があります。Binding構造体を直接使用する必要があります。これにより、値の読み取りまたは書き込み時に実行する独自のコードを提供できます。

import SwiftUI
/*
struct ContentView: View {
   @State private var blurAmount: CGFloat = 0 {
        didSet {
            print("New value is \(blurAmount)")
        }
    }
    var body: some View {
        VStack {
            Text("Hello, World!")
                .blur(radius: blurAmount)

            Slider(value: $blurAmount, in: 0...20)
        }
    }
}
 */

struct ContentView: View {
    @State private var blurAmount: CGFloat = 0

    var body: some View {
        
        let blur = Binding<CGFloat>(
            get: {
                self.blurAmount
            },
            set: {
                self.blurAmount = $0
                print("New value is \(self.blurAmount)")
            }
        )

        return VStack {
            Text("Hello, World!")
                .blur(radius: blurAmount)

            Slider(value: blur, in: 0...20)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

actionSheetで複数のオプションを表示する
Showing multiple options with ActionSheet

視覚的にアラートアクションシートは大きく異なります。iPhoneでは、アラートは画面の中央に表示され、ボタンを選択してアクティブに閉じる必要がありますが、アクションシートは下から上にスライドし、複数のボタンを含めることができ、タップすると閉じることができますキャンセル時またはアクションシートの外側をタップして。


struct ContentView: View {
    @State private var showingActionSheet = false
    @State private var backgroundColor = Color.white

    var body: some View {
        Text("Hello, World!")
            .frame(width: 300, height: 300)
            .background(backgroundColor)
            .onTapGesture {
                self.showingActionSheet = true
            }
            .actionSheet(isPresented: $showingActionSheet) {
                ActionSheet(title: Text("Change background"), message: Text("Select a new color"), buttons: [
                    .default(Text("Red")) { self.backgroundColor = .red },
                    .default(Text("Green")) { self.backgroundColor = .green },
                    .default(Text("Blue")) { self.backgroundColor = .blue },
                    .cancel()
                ])
            }
    }
}