禁用内容但启用滚动

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

我正在尝试将修饰符附加到 ScrollView,该修饰符仍然允许滚动并禁用所有底层按钮:

struct ContentView1: View {
    var body: some View {
        ScrollViewButtonDisableView()
            .modifier(ScrollHitModifier())
    }
}

struct ScrollViewButtonDisableView: View {
    var body: some View {
        ScrollView {
            VStack {
                ForEach(0...100, id: \.self) { buttonNumber in
                    Button("Press \(buttonNumber)") {
                        print("Button number \(buttonNumber) pressed")
                    }
                    .buttonStyle(.borderedProminent)
                    .font(.title)
                    .padding()
                }
            }
        }
    }
}

struct ScrollHitModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .allowsHitTesting(false)
    }
}

不幸的是,结果是按钮和滚动都不再起作用。我仍然希望能够滚动。

我知道我可以将修饰符 ScrollHitModifier() 添加到 ScrollViewButtonDisableView 中的 VStack,但这违背了我正在寻找的目的。我想向整个结构添加一个修饰符,而不必将其放入结构中。 有没有办法将

.allowsHitTesting
修饰符附加到 ScrollViewButtonDisableView 并且仍然允许滚动?

swiftui scrollview hittest
1个回答
0
投票

您可以将虚拟

TapGesture
作为
.highPriorityGesture
添加到
ScrollView
。这会阻止对
ScrollView
内的内容进行点击手势,但仍允许执行滚动:

struct ScrollHitModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .highPriorityGesture(
                TapGesture()
                    .onEnded {
                        // Do nothing
                    }
            )
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.