SwiftUI覆盖层阻止了列表滚动事件。

6

我希望在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)
        )
    }
}

外观看起来如预期,但是如果将手指放在图像边界内,则列表的滚动不起作用(如果尝试在图像外滚动,则正常工作)。

我尝试在opacity后面添加 .allowsHitTesting(false),但它没有改变任何东西。

使用ZStack而不是overlay也无济于事。我找到的唯一解决方法是使用ZStack,将图像放在列表后面并使列表半透明,但这不是我要找的解决方案(它稍微改变了列表的颜色,并导致某些动画出现问题)。

有办法让它工作吗?比如使图像将事件传递给后台的列表之类的。


看起来像是个bug。实际上,当应用于覆盖层时,.allowsHitTesting(false)应该可以工作,但不适用于列表。 - davidev
2
已知 SwiftUI 的一个 bug(对于所有这种重叠情况)- 向苹果提交反馈,反馈越多越好。 - Asperi
1个回答

2
这绝对是SwiftUI的一个bug。我遇到了同样的问题,但找到了一个解决方法。
struct ContentView: View {
    var body: some View {
        List {
            Text("first")
            Text("second")
            Text("third")
        }
        .overlay(
            ScrollView {
                Image(systemName: "hifispeaker")
                    .resizable()
                    .frame(width: 200, height: 200)
                    .opacity(0.15)
            }
            .frame(width: 200, height: 200)
            .disabled(true)
        )
    }
}

通过将您的叠加层嵌入带有.disabled(true)修饰符的ScrollView中,手势可以正确地传递到列表,并且不会阻止滚动。

1
那实际上很有趣。 - Beginner
2
奇怪。有人能修复SwiftUI吗? - heiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接