我在水平滚动视图中遇到了一个问题。当调用onitemTapped
和onDelete
方法时,添加或删除了一个项目,ScrollView
被重置到原始位置。我想实现的是,当删除或添加单个itemView
时,X轴上的偏移量不会改变。对于ScrollViewWithOffset我使用了this example。这是我的验证码:
public struct ItemView: View {
var action: () -> Void
@ObservedObject var itemData: ItemData
@State private var isReducedSize: Bool = false
public init(action: @escaping () -> Void, itemData: itemData) {
self.action = action
self.itemData = itemData
}
public var body: some View {
HStack {
ScrollViewWithOffset(onScroll: handleScroll) {
ItemCollectionView(itemData: itemData)
}
}
.padding(8)
}
private func handleScroll(_ offset: CGPoint) {
withAnimation {
if offset.x >= -100 {
self.isReducedSize = false
} else {
self.isReducedSize = true
}
}
}
}
struct ItemCollectionView: View {
@ObservedObject var itemData: itemData
public var body: some View {
HStack {
ForEach(itemData.items, id: \.id) { item in
itemView(
content: itemViewContentProvider.content(
item: item,
onitemTapped: { item in
itemData.add(item) },
onDelete: { item in
itemData.remove(item)
})
)
}
}
}
}
struct itemView: View {
let content: itemViewContent
var body: some View {
HStack {
Button(action: {
content.onitemTapped(content.item)
}, label: {
Text(content.itemTitle)
.font(.copy)
.foregroundColor(.contentLead)
})
Button(action: {
content.onDelete(content.item)
}, label: {
Image(uiImage: .icons.close)
.resizable()
.frame(width: 10, height: 10)
.foregroundColor(.contentSecondary)
})
}
.padding(.horizontal, 8)
.background(Rectangle()
.foregroundColor(.backgroundContrast)
.cornerRadius(4)
.frame(height: 30))
.frame(height: 30)
}
}
字符串
1条答案
按热度按时间pwuypxnk1#
我可以编写自己的滚动视图,并在一个状态下保存偏移量,作为与总大小的关系,这将依赖于固定的项目大小。或者保持定义的容量并增加元素,而不是删除它们,我会通过一个简单的if语句来增加。这样滚动视图就不必再次呈现,因此保持它的位置。我使用的解决方案在HStack上作为修改器工作,看起来像这样:
字符串