100 Days of SwiftUI(DAY 93(Project18 part 2))

今日は、ビューレイアウトに関するテクニックプロジェクトを続行し、使用可能な最も強力なレイアウトビューの1つを探索しますGeometryReader。これにより、実行時にビューのサイズと位置を読み取り、時間とともに変化するこれらの値を読み取り続けることができます。

おそらくそれほど特別に聞こえないかもしれませんが、見栄えがよく、作成するのに1行または2行のコードしか必要としない多くの魅力的な効果への扉が開かれます。はい、1つまたは2つGeometryReaderです。動作を理解したら、少し時間をかけて実験できることを願っています。

イギリスの詩人ウィリアムブレイクがかつて言ったように、「本当の知識の方法は実験である」ので、もしあなたが本当にこれを頭にくっつけたいなら、それで遊んでみるべきです!

SwiftUIビューの絶対配置
Absolute positioning for SwiftUI views

GeometryReader内のフレームと座標を理解する
Understanding frames and coordinates inside GeometryReader

GeometryReader

GeometryReaderを使用したScrollView効果
ScrollView effects using GeometryReader


//
//  ContentView.swift
//  LayoutAndGeometry

import SwiftUI

struct OuterView: View {
    var body: some View {
        VStack {
            Text("Top")
            InnerView()
                .background(Color.green)
            Text("Bottom")
        }
    }
}

struct InnerView: View {
    var body: some View {
        HStack {
            Text("Left")
            GeometryReader { geo in
                Text("Center")
                    .background(Color.blue)
                    // On Tap!!
                    .onTapGesture {
                        print("Global center: \(geo.frame(in: .global).midX) x \(geo.frame(in: .global).midY)")
                        print("Custom center: \(geo.frame(in: .named("Custom")).midX) x \(geo.frame(in: .named("Custom")).midY)")
                        print("Local center: \(geo.frame(in: .local).midX) x \(geo.frame(in: .local).midY)")
                    }
            }
            .background(Color.orange)
            Text("Right")
        }
    }
}

/*
struct ContentView: View {
    let colors: [Color] = [.red, .green, .blue, .orange, .pink, .purple, .yellow]

    var body: some View {
        GeometryReader { fullView in
            ScrollView(.vertical) {
                ForEach(0..<50) { index in
                    GeometryReader { geo in
                        Text("Row #\(index)")
                            .font(.title)
                            .frame(width: fullView.size.width)
                            .background(self.colors[index % 7])
                            //.rotation3DEffect(.degrees(Double(geo.frame(in: .global).minY) / 5), axis: (x: 0, y: 1, z: 0))
                            .rotation3DEffect(.degrees(Double(geo.frame(in: .global).minY - fullView.size.height / 2) / 5), axis: (x: 0, y: 1, z: 0))
                    }
                    .frame(height: 40)
                }
            }
        }
    }
}
*/
/*
struct ContentView: View {
    let colors: [Color] = [.red, .green, .blue, .orange, .pink, .purple, .yellow]

    var body: some View {
        GeometryReader { fullView in
            ScrollView(.horizontal, showsIndicators: false) {
                HStack {
                    ForEach(0..<50) { index in
                        GeometryReader { geo in
                            Rectangle()
                                .fill(self.colors[index % 7])
                                .frame(height: 150)
                                .rotation3DEffect(.degrees(-Double(geo.frame(in: .global).midX - fullView.size.width / 2) / 10), axis: (x: 0, y: 1, z: 0))
                        }
                        .frame(width: 150)
                    }
                }
                .padding(.horizontal, (fullView.size.width - 150) / 2)
            }
        }
        .edgesIgnoringSafeArea(.all)
    }
}
 */

struct ContentView: View {
    var body: some View {
        OuterView()
            .background(Color.red)
            .coordinateSpace(name: "Custom")
    }
}
 

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