在SwiftUI的ScrollView中,尝试以编程方式确定项目何时显示在屏幕上。我知道ScrollView一次渲染整个视图,而不是像List一样逐个渲染(这也是我必须使用ScrollView的原因之一,因为我有.scrollTo操作)。
我还知道,在UIScrollView中,可以在UIScrollViewDelegate中使用CGRectIntersectsRect来判断项目帧和ScrollView帧之间的交叉情况,但如果可能的话,我更愿意在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
中使用LazyVStack
来触发当项目出现在屏幕上时的onAppear
。但这需要 iOS 14 或以上版本。 - Tomas Jablonskis