タブレット用プログラムの書き止め

android OS & iPadOS の記録。

【Swift P4.5.1】座標系がややこしいのと難解案件

2024-09-26 23:51:10 | Swift iPadOS用

WindowsやAndroidは、左上が(0,0)。
画面の座標、画像の座標、0,0に合わせれば、見えている画面の左上に画像の左上が重なる。

Swiftは、そんな簡単ではない^^;
画像アスペクト比1:1でスケールを1にしたとき、画面より画像が大きいとセンター合わせにされてしまう。
alignment: .leading や alignment: .top でも。

原点とは別に基準点?が画像中央にあり、補正メソッドを組み込まないと面倒。

 

不思議なのは、GeometryReader { geometry in  }で括ると画面左上と画像左上が合わさる。なぜ?

【ContentView.swift】

import SwiftUI

struct ContentView: View {   // タイプA 左上合致
    var body: some View {
        GeometryReader { geometry in // 画面情報取得用
            VStack(alignment: .leading) {
                let uii = UIImage(named: "Test") // "Test"はアセットに大きい画像を用意した
                Image(uiImage: uii!)
                    .resizable()
                    .aspectRatio((uii!.size.width/uii!.size.height), contentMode: .fill)
                
                Text("width: \(uii!.size.width)")  // ”\” は、バックスラッシュ
                Text("height: \(uii!.size.height)")
            }
        }
    }
}


struct ContentView: View {   // タイプB 画像が小さければ左上合致
    var body: some View {
        VStack(alignment: .leading) {
                let uii = UIImage(named: "Test")
                Image(uiImage: uii!)
                    .resizable()
                    .aspectRatio((uii!.size.width/uii!.size.height), contentMode: .fill)
                
                Text("width: \(uii!.size.width)")
                Text("height: \(uii!.size.height)")
        }
    }
}

タイプAは、画面横幅より画像の横幅が大きくてもalignment: .leadingが効く。
タイプBは、画面横幅より画像の横幅が大きいと画面の中央と画像の中央が合わさるようだ。

シミュレーションの状態の話なので実機でどうなっているかは未確認。