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

Bra*_*mas 15 scrollview ios swiftui

尝试以编程方式确定 SwiftUI 中的 ScrollView 中的项目何时显示在屏幕上。我知道 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
                })
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Asp*_*eri 9

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

所以它应该像

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
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这在第一次向下滚动时有效,但是当用户向上滚动时,这些聊天将已经呈现,并且缩放不会更新,不是吗? (6认同)