我有一个 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 中更新,然后状态也会更新,但动画的问题看起来完全相同。)
我想在 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,将图像放在列表后面并使列表半透明,但这不是我正在寻找的解决方案(它会稍微改变列表的颜色并导致一些动画问题)。
有办法让它发挥作用吗?就像让图像将事件传递到后台列表之类的。