VStackに.onAppearを使ってもうまくはいかない。VStackの一部が開いた時点で発火するからな!答えは位置情報だ。わかったか?悩みに悩んだ一週間だった

だったらListでいいんじゃないの?って思うかもしれないけど、ListはScrollViewが中身入ってるっぽくて、無限スクロールと、sticky headerとの相性が悪かったのだ。

Twitterのマイページみたいなものを作りたかったから。なので、onAppearを使わないで、無限スクロール、つまり下の方に行ったときに発火して、続きが表示される『アレ』を頑張って実装したので、備忘録

最後にGeometryReaderをおいて、位置を比較して発火する

流れとしては、以下のとおり。

1.画面の縦の長さ(=画面の一番下のY座標みたいな感じ)を取る
2.アイテムリストの一番下にgeometryを入れて、座標をリアルタイムで取得する
3.geometryのY座標が、画面の高さより小さいときに、最後まで到達してると判断し、発火させる

///画面の高さ。この高さより、geometry部分が小さくなったら、発火させる
let displayHeight:CGFloat = UIScreen.main.bounds.height
 
VStack(spacing:0){
    
    ForEach(Dataset.Itemlist){item in
        CardView(PostCardData: item)
    }
    
    GeometryReader{proxy -> AnyView in
        return AnyView(
            EmptyView()
                .onChange(of: proxy.frame(in: .global).minY){newminY in //geometry部分の座標が変わったら更新したデータを吐き出す

                    if
                        newminY < displayHeight, ///GeometryReaderの領域の上の部分(newminY)が、画面の中(displayHeight)に入ってきた場合
                        (Date().timeIntervalSince1970 - APITimeData.LastTime) > 2 /// 現在時刻が、最終発火時刻より2秒以上経過してる場合
                    {

                        ///続きを読むを連打されないよう、最後に実行した日時を記録
                        APITimeData.SetTime()
                        
                        //次のデータを取得
                        Dataset.NextGet()
                    }
                }
        )
    }///end geometry
}

これでうまいこと解決できましたよ。

よかったよかった。本当によかったよ

コメント