SwiftUI ScrollView + LazyVStack: расширение ячейки приводит к ее прокрутке из поля зрения — как сохранить видимость развIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI ScrollView + LazyVStack: расширение ячейки приводит к ее прокрутке из поля зрения — как сохранить видимость разв

Сообщение Anonymous »

Я использую ScrollView с LazyVStack и расширяемой карточкой.
Когда я касаюсь карточки, чтобы развернуть ее (открывая больше содержимого), расширенная карточка часто автоматически прокручивается из поля зрения.
Это отличается от того, как раньше вел себя UITableView, где при расширении ячейки нажимаемая ячейка оставалась видимой и настраивалось содержимое вокруг нее.
Ожидаемое поведение
Когда карточка развернута, он должен оставаться видимым (или в основном видимым) на экране.
Фактическое поведение
После расширения SwiftUI пересчитывает макет, и развернутая карточка уходит из поля зрения из-за сохранения смещения прокрутки.

Код: Выделить всё

import SwiftUI

struct ContentView: View {

struct Item: Identifiable {
let id = UUID()
let title: String
}

let items = (1...30).map { Item(title: "Item \($0)") }

@State private var expandedID: UUID?

var body: some View {
ScrollView {
LazyVStack(spacing: 12) {
ForEach(items) { item in
ExpandableCard(
item: item,
isExpanded: expandedID == item.id,
onTap: {
withAnimation {
expandedID = item.id
}
}
)
.id(item.id)
}
}
.padding()
}
}
}

struct ExpandableCard: View {
let item: ContentView.Item
let isExpanded: Bool
let onTap: () -> Void

var body: some View {
VStack(alignment: .leading, spacing: 8) {
Button(action: onTap) {
Text(item.title)
.font(.headline)
}

if isExpanded {
ForEach(0..Есть ли лучший подход в iOS 17+ (например, .scrollPosition)?
Или это известное ограничение ScrollView + LazyVStack? 

Подробнее здесь: [url]https://stackoverflow.com/questions/79854313/swiftui-scrollview-lazyvstack-expanding-a-cell-causes-it-to-scroll-out-of-vie[/url]
Ответить

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

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

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

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

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