【问题标题】:Custom modifier block the ScrollView scroll action自定义修饰符阻止 ScrollView 滚动动作
【发布时间】:2020-09-25 05:46:06
【问题描述】:

我有一个 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) 但它不起作用。

你们知道我怎样才能超越它吗?

提前感谢您对未来的任何帮助:D

PS:我已经检查了那个链接 -> How to disable user interaction on SwiftUI view? 以及苹果论坛上的一个链接(这里没有)。

【问题讨论】:

    标签: swift uiscrollview swiftui


    【解决方案1】:

    只需将 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
        }
    }
    

    【讨论】:

    • 这很好,但我需要顶部的阴影,以便它覆盖滚动视图。这是在
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多