Вот как я это реализую:
Код: Выделить всё
struct CustomVerticalScrollView: View {
let content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
ScrollView {
content
Color
.clear
.frame(width: 0, height: 0)
.modifier(ViewAppearsOnScreen())
.onPreferenceChange(IsOnScreenKey.self) { value in
if value == true {
print("Has reached end!")
}
}
}
.background(.green)
}
}
struct ViewAppearsOnScreen: ViewModifier {
func body(content: Content) -> some View {
GeometryReader { geometry in
// Check if this view's frame intersects with the visible screen bounds
content
.preference(
key: IsOnScreenKey.self,
value: isViewVisible(geometry: geometry)
)
}
}
// Determines if the view is visible within the screen's bounds
private func isViewVisible(geometry: GeometryProxy) -> Bool {
let frame = geometry.frame(in: .global) // Get the frame in global space
let screenBounds = UIScreen.main.bounds // Screen boundaries
return screenBounds.intersects(frame) // Check if it intersects with screen bounds
}
}
И вот как я его использую:
р>
Код: Выделить всё
struct ContentView: View {
var body: some View {
CustomVerticalScrollView{
VStack(spacing: .zero) {
Color
.blue
.frame(maxWidth: .infinity)
.frame(height: 1000)
}
}
}
}

- Когда у меня нет четкого представления цветов, кажется, что в конце не добавляется пробел, хотя отступов нет, а высота представления равна 0 (третий элемент в таблице).
- Когда я добавляю очистку в цветном представлении добавляется значительный интервал в конце (первый элемент в таблице)
- Если я удалю два упомянутых модификатора из второго элемента в таблице, некоторые отступы все равно останутся - вероятно, здесь задействована программа чтения геометрии
Подробнее здесь: https://stackoverflow.com/questions/784 ... scrollview
Мобильная версия