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

问题描述 投票:0回答:1

设置:

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

问题:

按钮的

enable
状态取决于单元格是否被滑动,但我找不到检查这个的方法。

我尝试了滑动按钮的

.onAppear
.onDisappear
,但是
.onAppear
仅在按钮添加到视图层次结构时被调用。当点击单元格以取消滑动单元格时,按钮会移出视线,但不会从视图层次结构中删除,并且不会调用
.onDisappear
。此外,如果再次滑动单元格,按钮只会移入以变为可见,但不会添加到视图层次结构中,即
.onAppear
不会再次调用。

我还想在列表单元格中使用

GeometryReader
,因为在滑动或取消滑动期间,单元格中视图的框架会发生变化。 但是,GeometryReader 仅在重绘视图时更新这些值,并且在滑动/取消滑动期间不会重绘单元格。

问题:

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

ios swiftui swipe
1个回答
0
投票

使用

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

© www.soinside.com 2019 - 2024. All rights reserved.