22/8/8追記
こちらのページにGeometryReaderについて改めて整理しました
問題
動的にviewを作って各オブジェクトの位置を取得して、指定のY座標まで進んだら処理実行したい、なんてことありますよね。そんな時にGeometryReader
使ったらレイアウト崩れちゃったんですけど!?ってお話。
上記1,2の違いは、下記コードそのままが1, コメントアウトを解除したのが2
import SwiftUI
struct ContentView: View {
var body: some View {
VStack{
ScrollView(.vertical, showsIndicators: false){
VStack(spacing:0){
ForEach(1..<100) { num in
//GeometryReader {geometry in
Text("\(num)行目").background(Color.blue.opacity(0.1))
// let _ = print(num, geometry.frame(in:.global).minY)
//}
}
}
}
}
}
}
解決
空のテキストを入れて、GeometryReader
のサイズをゼロにしてやりました
import SwiftUI
struct ContentView: View {
var body: some View {
VStack{
ScrollView(.vertical, showsIndicators: false){
VStack(spacing:0){
ForEach(1..<100) { num in
GeometryReader {geometry in
Text("")
let _ = print(num, geometry.frame(in:.global).minY)
}.frame(height:0)
Text("\(num)行目").background(Color.blue.opacity(0.1))
}
}
}
}
}
}
これで余計な余白はなくなって、コンソールで場所を取得できていることも確認できます(オブジェクトのサイズは取れてなくてスタート地点ですが)。
おしまい