ios 是否可以在SwiftUI中实现'ScrollView'交互式键盘解散?

t30tvxxf  于 2023-03-05  发布在  iOS
关注(0)|答案(7)|浏览(330)

https://developer.apple.com/documentation/uikit/uiscrollview/keyboarddismissmode/interactive
在典型的UIScrollView上,可以设置此属性以使键盘在滚动的同时以交互方式消失。
在SwiftUI中可以实现这一点吗?如果在ScrollView上不能直接使用,我假设直接嵌入UIScrollView是可能的。🤔

gxwragnw

gxwragnw1#

我在ContentView的onAppear修饰符中添加了代码,它可以是onDrag.interactive,这取决于您何时要关闭键盘:

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

uemypmqf2#

是的,
将此代码添加到init()

init() {
    // on a list:
    // UITableView.appearance().keyboardDismissMode = .interactive
    UIScrollView.appearance().keyboardDismissMode = .interactive
}
3phpmpom

3phpmpom3#

还想指出的是,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
    }
}
kzmpq1sx

kzmpq1sx4#

看一下SwiftUI文档,这似乎还不太可能。我认为最好的选择是将UIScrollView封装到UIViewRepresentable中。请参阅here了解开发人员讨论。我找到了tutorial for a UIScrollView here,您只需将KeyboardDismissmode添加到代码中即可

h79rfbju

h79rfbju5#

可以,请参阅https://github.com/michaelhenry/KeyboardAvoider
在“KeyboardAvoider {}”内环绕视图
或者
使用视图修饰符.avoidKeyboard()

mnowg1ta

mnowg1ta6#

对于那些正在使用SwiftUI '列表'并希望取消键盘的用户,请使用下面的命令。UIScrollView取消了emoji键盘水平滚动的键盘。

UITableView.appearance().keyboardDismissMode = .onDrag
fnx2tebb

fnx2tebb7#

对于那些还在为此挣扎的人来说。
正如@yawnobleix所提到的,ScrollView上没有任何内置的修改器来实现iOS〈16.0
将UITableView外观分配给整个应用程序并不总是最好的选择,所以我找到了另一个使用DragGesture的选项

struct ContentView: View {
    var body: some View {
        ScrollView {
            // your content
        }
        .gesture(DragGesture().onChanged { _ in
            endEditing()
        })
    }
}

extension View {
    func endEditing(_ force: Bool = true) {
        UIApplication.shared.windows.forEach { $0.endEditing(force)}
    }
}

快速用户界面4.0

最后,苹果在ScrollView上加上了ScrollDismissesKeyboardMode修饰符。

.scrollDismissesKeyboard(.interactively) //iOS 16.0 or newer

相关问题