如何检查项目是否可见 - 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
})
}
}
}
尝试以编程方式确定项目何时在 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
})
}
}
}