可以在SwiftUI中实现`ScrollView`交互式键盘关闭吗?

时间:2019-08-06 20:00:13

标签: ios swiftui

https://developer.apple.com/documentation/uikit/uiscrollview/keyboarddismissmode/interactive

在典型的UIScrollView上,可以设置此属性,以使键盘与滚动条一起交互式退出。

有可能在SwiftUI中实现吗?如果无法在ScrollView上直接使用它,我认为可以通过直接嵌入UIScrollView来实现。 ?

5 个答案:

答案 0 :(得分:5)

还要指出,jsbeginnerNodeJSanswer也可以在任何滚动视图中使用,例如List。例如:

struct ContentView: View {
    @ObservedObject private var viewModel = GistsViewModel()

    var body: some View {
        NavigationView {
            VStack {
                SearchBar(text: $viewModel.searchText)

                List {
                    ForEach(viewModel.gists) { gist in
                        NavigationLink(destination: SafariView(url: gist.htmlURL)
                            .navigationBarTitle("")
                            .navigationBarHidden(true)) {
                                GistView(gist: gist)
                        }
                    }
                }
                .navigationBarTitle(Text("GitHub Gists"))
                .edgesIgnoringSafeArea(.bottom)
            }
        }
    }

    init() {
        UIScrollView.appearance().keyboardDismissMode = .interactive
    }
}

答案 1 :(得分:3)

我将代码添加到ContentView的onAppear修饰符中。可以是onDrag.interactive取决于您要关闭键盘的时间:

struct ContentView: View {
    var body: some View {
        Text("Hello World")
            .onAppear {
                UIScrollView.appearance().keyboardDismissMode = .onDrag
            }
    }
}

答案 2 :(得分:0)

SwiftUI文档似乎还不可能。我认为您最好的选择是将UIScrollView包装到UIViewRepresentable中,请参见here进行开发。我发现有一个tutorial for a UIScrollView here,您只需要在代码中添加KeyboardDismissmode

答案 3 :(得分:0)

是的,请参阅https://github.com/michaelhenry/KeyboardAvoider

将视图包装在“ KeyboardAvoider {}”中

使用ViewModifier“ .avoidKeyboard()”

答案 4 :(得分:-1)

是的

将此代码添加到init()

 foreach($q as $row2){
    print "<tr><td>".$row2['game_name']."</td>";
    print "<td class=".$row2['mobile_version_sports.status'].">".$row2['OS.mobile_version_sports']." 
 </td>";
    print "<td class=".$row2['status.android_sports'].">".$row2['OS.android_sports']."</td></tr>";
}