如何检查项目是否可见 - SwiftUI ScrollView

How to check if item is visible - SwiftUI ScrollView

尝试以编程方式确定项目何时在 SwiftUI 的滚动视图中显示在屏幕上。我知道 ScrollView 一次呈现,而不是在项目出现时呈现(如在列表中),但我不得不使用 ScrollView,因为我有 .scrollTo 操作。

我也知道在带有 UIScrollView 的 UIKit 中,可以在 UIScrollViewDelegate 中的项目框架和 ScrollView 框架之间使用 CGRectIntersectsRect,但如果可能的话我更愿意在 SwiftUI 中找到解决方案。

示例代码如下所示:

ScrollView {
    ScrollViewReader { action in
        ZStack {
            VStack {
                ForEach(//array of chats) { chat in
                    //chat display bubble
                        .onAppear(perform: {chatsOnScreen.append(chat)})
                }.onReceive(interactionHandler.$activeChat, perform: { _ in
                    //scroll to active chat
                })
            }
        }
    }
}

理想情况下,当用户滚动时,它会检查屏幕上有哪些项目并缩放视图以适合屏幕上最大的项目。

当您在 ScrollView 中使用 VStack 时,所有内容都是在构建时立即创建的,因此 onAppear 不符合您的意图,您应该使用 LazyVStack , 它只会在每个子视图出现在屏幕上之前创建它,因此 onAppear 将在您期望的时候被调用。

所以应该是这样的

ScrollViewReader { action in
   ScrollView {
        LazyVStack {                              // << this !!
            ForEach(//array of chats) { chat in
                //chat display bubble
                    .onAppear(perform: {chatsOnScreen.append(chat)})
            }.onReceive(interactionHandler.$activeChat, perform: { _ in
                //scroll to active chat
            })
        }
    }
}