小编Mat*_*z K的帖子

在 SwiftUI 列表中移动项目时不需要的动画

我有一个 SwiftUI 列表,就像下面的示例代码一样。

struct ContentView: View {
    @State var numbers = ["1", "2", "3"]
    @State var editMode = EditMode.inactive

    var body: some View {
        NavigationView {
            List {
                ForEach(numbers, id: \.self) { number in
                    Text(number)
                }
                .onMove {
                    self.numbers.move(fromOffsets: $0, toOffset: $1)
                }
            }
            .navigationBarItems(trailing: EditButton())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我进入编辑模式并将项目向上移动一个位置时,在我放下项目后会发生奇怪的动画(见下面的 gif)。看起来拖动的项目回到原来的位置,然后再次移动到目的地(带动画)

重新排序项目时出现奇怪的动画

有趣的是,如果您将项目向下拖动列表或向上拖动多个位置,则不会发生这种情况。

我猜这是因为当状态中的项目被重新排序时,即使它们已经通过拖放在视图端重新排序,列表也会执行动画。但显然,除了将项目向上移动一个位置之外,它在所有情况下都能很好地处理它。

关于如何解决这个问题的任何想法?或者它可能是一个已知的错误?

我使用的是 XCode 11.4.1,构建目标是 iOS 13.4

(另请注意,在“真实世界”应用程序中,我使用的是 Core Data,当移动项目时,它们的顺序会在 DB 中更新,然后状态也会更新,但动画的问题看起来完全相同。)

ios swift swiftui swiftui-list

9
推荐指数
1
解决办法
1471
查看次数

SwiftUI 覆盖阻止列表滚动事件

我想在 SwiftUI 中的列表顶部放置一个半透明图像叠加层。我试过这样的代码:

struct ContentView: View {
    var body: some View {
        List {
            Text("first")
            Text("second")
            Text("third")
        }
        .overlay(
            Image(systemName: "hifispeaker")
                .resizable()
                .frame(width: 200, height: 200)
                .opacity(0.15)
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来符合预期,但如果您将手指放在图像边界内,则列表的滚动不起作用(如果您尝试滚动到图像之外,则效果很好)

我尝试.allowsHitTesting(false)在不透明度之后添加,但它不会改变任何东西。

使用ZStack代替overlay也没有帮助。我发现的唯一解决方法是使用ZStack,将图像放在列表后面并使列表半透明,但这不是我正在寻找的解决方案(它会稍微改变列表的颜色并导致一些动画问题)。

有办法让它发挥作用吗?就像让图像将事件传递到后台列表之类的。

swift swiftui swiftui-list

6
推荐指数
1
解决办法
2293
查看次数

标签 统计

swift ×2

swiftui ×2

swiftui-list ×2

ios ×1