(SwiftUI) Сегментированный сборщик в закрепленном заголовке раздела не обновляет ScrollView ContentHeight должным образоIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 (SwiftUI) Сегментированный сборщик в закрепленном заголовке раздела не обновляет ScrollView ContentHeight должным образо

Сообщение Anonymous »

В представлении прокрутки я пытаюсь закрепить заголовок раздела с простым сегментированным элементом PickerView, который может переключаться на два разных стека элементов. Один очень длинный и один очень короткий. Это работает нормально, если разделHeader не является липким. Как только он становится липким, начинаются проблемы:
Как вы можете видеть на видео, если я прокрутлю длинную левую сторону (пока она липкая), а затем переключусь на короткую правую сторону , StickyHeader теряет свою закрепленную позицию. Есть ли способ предотвратить это? Я уже пробовал несколько вещей, но безуспешно. (Например, прокси-сервер GeometryReaders, который вручную прокручивается вверх, как только я переключаю кран)
Насколько я понимаю, проблема заключается в ContentHeight ScrollViews, который не обновляется. правильно. Это очень хорошо заметно, поскольку ScrollViewIndicator также не получает визуального обновления по своей длине.
Можно ли этого достичь, или PickerView не предназначен для работы в списке из нескольких Разделы вообще? Есть ли способ обновить ScrollView ContentHeight таким образом, чтобы StickyHeader сохранял свое положение?
Любой подсказка очень ценится!
Я' Мы также добавили видео и исходный код для справки.
Изображение

struct ContentView: View {
@State private var tab = 0

var body: some View {
VStack(spacing: 0) {
let cols = [GridItem(.flexible())]

ScrollView {
LazyVGrid(columns: cols, pinnedViews: [.sectionHeaders]) {

Section {
ForEach(1...2, id: \.self) { count in
Text("Section 1 Item \(count)")
.frame(maxWidth: .infinity, alignment: .leading)
.padding().border(Color.blue)
}
} header: {
Text("Section 1")
.frame(maxWidth: .infinity, minHeight: 50, alignment: .center)
.background(Color.blue)
}

Section {
if tab == 0 {
ForEach(10...20, id: \.self) { count in
Text("Section 2 Tab 0 Item \(count)")
.frame(maxWidth: .infinity, alignment: .leading)
.padding().border(Color.purple)
}
}

if tab == 1 {
ForEach(3...5, id: \.self) { count in
Text("Section 2 Tab 1 Item \(count)")
.frame(maxWidth: .infinity, alignment: .leading)
.padding().border(Color.purple)
}
}

} header: {
Picker("", selection: $tab) {
Text("Long").tag(0)
Text("Short").tag(1)
}
.pickerStyle(.segmented).padding().background(Color.purple)
}
}

LazyVGrid(columns: cols) {
Section {
ForEach(30...50, id: \.self) { count in
Text("Section 3 Item \(count)")
.frame(maxWidth: .infinity, alignment: .leading)
.padding().border(Color.green)
}
} header: {
Text("Section 3")
.frame(maxWidth: .infinity, minHeight: 50, alignment: .center)
.background(Color.green)

}
}
}
}
.font(.caption)
}
}

#Preview {
ContentView()
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... scrollview
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»