У меня LazyVStack
внутри ScrollView
, который находится под меньшим видом (желтый вид на изображении).
Проблема в том, что когда сетка прокручивается вверх, ячейки все еще могут получать касания через желтый вид, что мне действительно не нужно. Я хочу поместить поиск TextField
в это представление, и штрихи перепутаются, а пользовательский опыт — беспорядок. В примере кода я добавил кнопку для переключения на List
, чтобы проверить, есть ли у него такая же проблема с прокруткой. Это не так.
import SwiftUI
struct ContentView: View {
@State private var useList = false
@State private var gridLayout: [GridItem] = [GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())]
var data = (0...249).map { "\($0)" }
var body: some View {
NavigationView {
VStack {
TopInfoPane()
if useList {
List(data, id: \.self) { item in
NavigationLink(destination: Text(item)) {
Text(item)
}
}
} else {
ScrollView {
LazyVGrid(columns: gridLayout, alignment: .center, spacing: 8) {
ForEach(data, id: \.self) { item in
NavigationLink(destination: Text(item)) {
Cell(item: item)
}
}
}
}
}
}.navigationBarTitle("Scroller")
.navigationBarItems(trailing: Button(action: { useList.toggle() }) { Text("Swap") })
}
}
}
struct Cell: View {
var item: String
var body: some View {
Text(item)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 75)
.background(Color.green)
}
}
struct TopInfoPane: View {
var body: some View {
Text("TopInfoPane")
.frame(height: 48)
.frame(minWidth: 0, maxWidth: .infinity)
.background(Color.yellow)
}
}
Я пробовал установить анимацию в представлении на ноль и установить .allowsHitTesting(false
), но они не помогли. Я в растерянности, потому что действительно не ожидал, что ScrollView
все равно будет прокручиваться за пределы своего собственного фрейма.
Попробуйте закрепить ScrollView следующим образом