自定义修饰符阻止ScrollView滚动操作

时间:2020-09-25 05:46:06

标签: swift uiscrollview swiftui

我有一个Scrollview(非常基本)

        ScrollView(.vertical, showsIndicators: false, content: {
            VStack(content: {
                ForEach(self.elements, id: \.self) { _ in
                    Rectangle()
                        .frame(height: 30)
                        .background(Color.green)
                }
            })
        })
        .bottomInnerShadow(color: Color.black.opacity(0.45), radius: 0.5)

我正在使用如下的自定义说明符定义

fileprivate extension View {
    func bottomInnerShadow(color: Color, radius: CGFloat = 0.1) -> some View {
        modifier(BottomInnerShadow(color: color, radius: min(max(0, radius), 1)))
    }
}

private struct BottomInnerShadow: ViewModifier {
    var color: Color = .gray
    var radius: CGFloat = 0.1

    private var colors: [Color] {
        [color.opacity(0.49), color.opacity(0.0), .clear]
    }

    func body(content: Content) -> some View {
        GeometryReader { geo in
            content
                .overlay(LinearGradient(gradient: Gradient(colors: self.colors), startPoint: .bottom, endPoint: .top)
                            .frame(height: self.radius * self.minSide(geo)),
                         alignment: .bottom)
        }
    }

    func minSide(_ geo: GeometryProxy) -> CGFloat {
        CGFloat(3) * min(geo.size.width, geo.size.height) / 2
    }
}

它允许我创建阴影。 这里的问题是它阻止了我的滚动视图操作。我无法再滚动出现阴影的地方。 我尝试了allowsHitTesting(false)和&.disabled(true),但是没有用。

你们知道我如何超越它吗?<​​/ p>

在此先感谢您的帮助:D

PS:我已经检查了该链接-> How to disable user interaction on SwiftUI view?以及Apple论坛上的链接(此处没有)。

1 个答案:

答案 0 :(得分:0)

只需将 ViewModifier 更改为

private struct BottomInnerShadow: ViewModifier {
    var color: Color = .gray
    var radius: CGFloat = 0.1

    private var colors: [Color] {
        [color.opacity(0.49), color.opacity(0.0), .clear]
    }

    func body(content: Content) -> some View {
        GeometryReader { geo in
            ZStack {
                Rectangle().fill(Color.clear).overlay(LinearGradient(gradient: Gradient(colors: self.colors), startPoint: .bottom, endPoint: .top)
                                        .frame(height: self.radius * self.minSide(geo)),
                                    alignment: .bottom)
                content
            }

        }
    }

    func minSide(_ geo: GeometryProxy) -> CGFloat {
        CGFloat(3) * min(geo.size.width, geo.size.height) / 2
    }
}