【问题标题】:Button under ScrollView in SwiftUISwiftUI 中 ScrollView 下的按钮
【发布时间】:2020-04-01 20:14:12
【问题描述】:

我在Button 顶部有一个ScrollView,因为我希望ScrollView 的内容在滚动时移动到按钮的顶部。但是,目前这意味着按钮不起作用,我想是因为滚动视图正在接受触摸事件。有什么方法可以让按钮在 SwiftUI 中工作?

struct Test: View {
    @State var pressed:Bool = false
    
    var body: some View {
        ZStack {
            VStack {
                Button(action: {
                    self.pressed = true
                }) {
                    Text("Button")
                        .padding(20)
                        .accentColor(pressed ? Color.green : Color.red)
                }
                
                Spacer()
            }
            
            ScrollView {
                Spacer()
                    .frame(height:60)
                
                Color.gray
                    .frame(height:200)
                    .padding(10)
                
                Color.gray
                    .frame(height:200)
                    .padding(10)
            }
        }
    }
}

【问题讨论】:

  • 好的,很抱歉,但我不明白您为什么要滚动按钮...!?你有一个截图来解释为什么这是有意义的吗?是的,滚动视图当然会捕捉到触摸......我只是很好奇。
  • @Chris 我想要一个带有按钮的标题,当滚动视图滚动到最顶部时用户可以使用该按钮,但当用户滚动列表时并不重要,我附上了一个示例代码的屏幕截图。
  • @BenJacob 你找到解决这个问题的方法了吗?我也有同样的问题。
  • @SteV8 一样,你找到解决办法了吗?
  • @aheze 我不得不切换到 UIKit。

标签: ios swift button swiftui uiscrollview


【解决方案1】:
  1. 让 scrollView 下的 Image 显示出来。
  2. 在 ScrollView 上制作一个不可见的按钮框架以使用它。

1:

VStack{
    //Image Logo Start
    Image("img_Logo")
    .resizable()
    .padding(.all, 10.0)
    .frame(width: UIScreen.main.bounds.width * 0.4, height: UIScreen.main.bounds.height * 0.2)
    //Image Logo Done
}

2:

Button(action: {

    }) {

}.frame(width: 100, height: 100)

【讨论】:

    【解决方案2】:

    你必须把按钮放在最后,这样才能像这样“越过”滚动视图:

    struct ContentView: View {
        @State var pressed:Bool = false
    
        var body: some View {
            ZStack {
                ScrollView {
                    Spacer()
                        .frame(height:60)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
    
                    Color.gray
                        .frame(height:200)
                        .padding(10)
                }
    
                VStack {
                    Button(action: {
                        self.pressed = true
                        print("tapped")
                    }) {
                        Text("Button")
                            .padding(20)
                            .accentColor(pressed ? Color.green : Color.red)
                    }
    
                    Spacer()
                }
    
    
            }
        }
    }
    

    【讨论】:

    • 这意味着按钮总是在滚动视图的顶部,对吧?我希望它在下面
    • 是的,你是对的。但是,如果滚动视图应该在按钮上方并且按钮应该是可点击的,这怎么可能?然后你将不得不操纵 hitTesting - func...否则我不知道你将如何获得他的...
    • 这就是我发布这个问题的原因,问这怎么可能
    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多