100 Days of SwiftUI(DAY 92(Project18 part 1))

4つのトピックに取り組む必要があります。レイアウト、配置、カスタムガイドなどのルールについて学習します。

レイアウトとジオメトリ:はじめに
Layout and geometry: Introduction

SwiftUIでのレイアウトの仕組み
How layout works in SwiftUI

親ビューは子のサイズを提案します。
その情報に基づいて、子供は自分のサイズを選択し、親はその選択を尊重する必要があります。
次に、親が子をその座標空間に配置します。
SwiftUIは背後で4番目のステップを実行します。位置とサイズを浮動小数点数として保存しますが、レンダリングに関しては、SwiftUIはピクセルを最も近い値に丸めるため、グラフィックスは鮮明なままです。

leading
trailing
top異なるビュー間で分割されているビューで作業している場合、これらはまったく機能しません。ユーザーインターフェイスのまったく異なる部分にある2つのビューを同じように配置する必要がある場合。

SwiftUIはalignmentGuide()、まさにこの目的のための修飾子を提供します。これは2つのパラメーターを取ります。変更するガイドと、新しい配置を返すクロージャーです。クロージャーにはViewDimensions、ビューの幅と高さを含むオブジェクトと、さまざまなエッジを読み取る機能が与えられます。


var body: some View {
    VStack(alignment: .leading) {
        ForEach(0..<10) { position in
            Text("Number \(position)")
                .alignmentGuide(.leading) { _ in CGFloat(position) * -10 }
        }
    }
    .background(Color.red)
    .frame(width: 400, height: 400)
    .background(Color.blue)
}

カスタム配置ガイドを作成する方法
How to create a custom alignment guide

カスタムレイアウトガイド

custom layout guide.
VerticalAlignment
HorizontalAlignment

//
//  ContentView.swift
//  LayoutAndGeometry
//
//  Created by Naoki Abe on 2020/09/13.
//  Copyright © 2020 Naoki Abe. All rights reserved.
//

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack{
        HStack {
            VStack {
                Text("@twostraws")
                Image("picture")
                    .resizable()
                    .frame(width: 64, height: 64)
            }

            VStack {
                Text("Full name:")
                Text("PAUL HUDSON")
                    .font(.largeTitle)
            }
        }
        
        HStack(alignment: .midAccountAndName) {
            VStack {
                Text("@twostraws")
                    .alignmentGuide(.midAccountAndName) { d in d[VerticalAlignment.center] }
                Image("picture")
                    .resizable()
                    .frame(width: 64, height: 64)
            }

            VStack {
                Text("Full name:")
                Text("PAUL HUDSON")
                    .alignmentGuide(.midAccountAndName) { d in d[VerticalAlignment.center] }
                    .font(.largeTitle)
            }
        }
        }
    }
}
extension VerticalAlignment {
    struct MidAccountAndName: AlignmentID {
        static func defaultValue(in d: ViewDimensions) -> CGFloat {
            d[.top]
        }
    }

    static let midAccountAndName = VerticalAlignment(MidAccountAndName.self)
}

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