设置:
我的应用程序有一个带有一些按钮的工具栏和一个列表。可以滑动列表单元格。 滑动单元格时,我想禁用工具栏按钮,因为必须通过点击滑动按钮或点击单元格来完成滑动。
问题:
按钮的
enable
状态取决于单元格是否被滑动,但我找不到检查这个的方法。
我尝试了滑动按钮的
.onAppear
和.onDisappear
,但是.onAppear
仅在按钮添加到视图层次结构时被调用。当点击单元格以取消滑动单元格时,按钮会移出视线,但不会从视图层次结构中删除,并且不会调用.onDisappear
。此外,如果再次滑动单元格,按钮只会移入以变为可见,但不会添加到视图层次结构中,即 .onAppear
不会再次调用。
我还想在列表单元格中使用
GeometryReader
,因为在滑动或取消滑动期间,单元格中视图的框架会发生变化。
但是,GeometryReader 仅在重绘视图时更新这些值,并且在滑动/取消滑动期间不会重绘单元格。
问题:
如何在滑动单元格时禁用工具栏按钮?
使用
GeometryReader
解决的问题:
在名为
dataSource
的 ViewModel 中,我声明了 2 个变量。如果其中任何一个为真,所有工具栏按钮将被禁用:
@Published var anyCellIsLeadingSwiped = false
@Published var anyCellIsTrailingSwiped = false
然后我将以下叠加层应用到 CellView:
.overlay {
GeometryReader { geo in
Color(.clear)
.onChange(of: geo.frame(in: .global).minX) { newMinX in
let leadingSwiped = newMinX > 0.0
let trailingSwiped = newMinX < 0.0
if !dataSource.anyCellIsLeadingSwiped && leadingSwiped {
dataSource.anyCellIsLeadingSwiped = true
}
if dataSource.anyCellIsLeadingSwiped && !leadingSwiped {
dataSource.anyCellIsLeadingSwiped = false
}
if !dataSource.anyCellIsTrailingSwiped && trailingSwiped {
dataSource.anyCellIsTrailingSwiped = true
}
if dataSource.anyCellIsTrailingSwiped && !trailingSwiped {
dataSource.anyCellIsTrailingSwiped = false
}
}
}
}
需要覆盖以保持单元格布局不变。
滑动单元格时,单元格会向左或向右移动以使滑动按钮可见。这改变了全球
minX
.enabled
属性。