Стек выглядит так:
Код: Выделить всё
class ViewModel: ObservableObject {
@Published
var isRefreshing = false
var components: [Int] = Array(0...100)
func refresh() {
isRefreshing = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.isRefreshing = false
}
}
}
struct ContentView: View {
@StateObject
private var viewModel: ViewModel
init() {
_viewModel = StateObject(wrappedValue: ViewModel())
}
var body: some View {
ScrollView(showsIndicators: false) {
LazyVStack(spacing: .zero, pinnedViews: [.sectionHeaders]) {
Section {
if viewModel.isRefreshing {
loadingView
} else {
ForEach(viewModel.components, id: \.hashValue) { _ in
Rectangle()
.frame(height: 700)
.foregroundStyle(Color.blue)
.padding(.bottom, 24)
}
}
} header: {
filterBar
.onTapGesture {
viewModel.refresh()
}
}
}
}
}
var filterBar: some View {
Rectangle()
.foregroundStyle(Color.yellow)
.frame(height: 100)
}
var loadingView: some View {
Rectangle()
.foregroundStyle(Color.green)
.frame(height: 300)
}
}
В большинстве случаев это работает нормально. Но в некоторых случаях LoadingView не отображается. Вместо этого весь вид пуст (я вижу только фон). Иногда он исчезает после обновления контента, но иногда он зависает на этом пустом контенте, пока пользователь не начнет прокручивать снова.
Запись показывает проблему. Немного прокручиваем представление, а затем нажимаем на фильтр. Вместо отображения загрузки он просто становится пустым. Иногда это работает нормально.

Пример выше был максимально упрощен. Тем не менее проблема сохраняется. Попытка прокрутить обратно вверх не решила проблему, поскольку пустой фон продолжает появляться время от времени.
Если посмотреть на визуальный отладчик, то обнаружится, что элемент управления ScrollView находится там. правильная ширина и высота. Но контент просто не в окне просмотра.
Подробнее здесь: https://stackoverflow.com/questions/785 ... he-content
Мобильная версия