ios 如何在滑动列表单元格时禁用工具栏按钮?

2nbm6dog  于 2023-04-08  发布在  iOS
关注(0)|答案(1)|浏览(111)

设置:

我的应用程序有一个带有一些按钮的工具栏和一个列表。列表单元格可以滑动。当滑动单元格时,我想禁用工具栏按钮,因为滑动必须完成,无论是通过点击滑动按钮还是点击单元格。

问题:

按钮的enable状态取决于单元格是否被刷过,但我找不到检查这一点的方法。
我尝试了滑动按钮的.onAppear.onDisappear,但只有当按钮添加到视图层次结构时才会调用.onAppear。当点击单元格以取消滑动单元格时,按钮会移出视线,但不会从视图层次结构中删除,并且不会调用.onDisappear。此外,如果再次滑动单元格,按钮只会移入以变得可见,但不添加到视图层次结构,即,不再次调用.onAppear
我还想在列表单元格中使用GeometryReader,因为在滑动或取消滑动期间,单元格中视图的框架会发生变化。然而,GeometryReader仅在视图被重绘时更新这些值,而单元格在滑动/取消滑动期间不会被重绘。

问题:

如何在滑动单元格时禁用工具栏按钮?

9gm1akwq

9gm1akwq1#

使用GeometryReader解决的问题:
在名为dataSource的ViewModel中,我声明了2个变量。如果其中任何一个为true,则所有工具栏按钮都将被禁用:

@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
根据当前的滑动状态,ViewModel中的变量被设置。由于它们被发布,这会重绘工具栏。它的按钮使用这些变量作为它们的enabled属性。

相关问题