Проблема
Я отображаю список данных, используя оператор ForEach
, когда пользователь взаимодействует с каждым видом, размер изменяется и отображается в полноэкранном режиме, проблема заключается в Состояние изменяет размер каждого вида, а не только выбранного. Попытка скопировать карточки домашней страницы App Store.
Что я пытаюсь
Я подумал, может быть, используя значение индекса, я мог бы
ForEach(objects.indices, id: \.self) { index in
ObjectView(home: self.objects[index], showContent: self.$showContent)
}
А потом, возможно, сохранить значение индекса, тогда только изменить размер, если индекс объекта соответствует сохраненному значению индекса. Однако при попытке использовать индексы я получаю следующую ошибку:
Ошибка: неоднозначная ссылка на «индексы» члена
Полный код:
struct Object: Identifiable {
var id = UUID()
var title: String
var subtitle: String
var show = false // Maybe set this to true when tapped then use self.objects[index].show for Fram size, but not sure how to get index or make this work
}
struct AppView: View {
@EnvironmentObject var session: SessionStore
@Binding var showContent: Bool
var body: some View {
ScrollView(.vertical, showsIndicators: false){
VStack() {
VStack(alignment: .center, spacing: 32) {
ForEach(objectData, id: \.id) { item in
GeometryReader { geometry in
ContentView(object: item, showContent: self.$showContent)
.offset(y: self.showContent ? -geometry.frame(in: .global).minY : 0)
}
.frame(height: self.showContent ? screen.height : 464)
.frame(maxWidth: self.showContent ? .infinity : screen.width - 40)
}
}.offset(x: 0, y: -80)
}.padding(.bottom, 300)
.animation(.spring(response: 0.5, dampingFraction: 0.6, blendDuration: 0))
}.edgesIgnoringSafeArea(.all)
}
}
struct ObjectCardView: View {
var object: Object
@Binding var showContent:Bool
var body: some View {
VStack(alignment: .leading, spacing: 0) {
ScrollView(.vertical, showsIndicators: false) {
Image(object.image)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(height: self.showContent ? 364 : 284)
.clipped()
.onTapGesture {
self.session.selectedObject = self.object
self.showContent.toggle()
}
if showContent {
VStack {
DetailsView(object: Object)
}
}
}
}
}
PS: у меня есть проблема, связанная с представлением, которое заключается в том, что дочернее представление прокрутки изменяет родительское представление прокрутки, и касание дочернего элемента фактически взаимодействует с содержимым в родительском элементе. Поэтому, если я открою карточку и прокручиваю ее, затем коснусь, представление прокрутки AppView также прокрутит и откроет / закроет другие карточки.