SwiftUI-关闭滚动键盘

时间:2019-10-24 11:49:32

标签: ios swiftui

我有一个简单的搜索列表:


struct ContentView: View {
    @State var text:String = ""
    var items = 1...100
    var body: some View {
        VStack {
            List {
                TextField("Search", text: $text)
                Section{
                    ForEach(items.filter({"\($0)".contains(text)}),id: \.self){(i) in
                       Text("option \(i)")
                    }
                }
            }
        }
    }
}

iOS simulator screenshot

滚动超过2个单元格/几个点时,如何关闭键盘?

4 个答案:

答案 0 :(得分:2)

如果您使用ScrollView(可能也使用List,但我尚未确认),则可以使用UIScrollView appearance,这会影响所有的ScrollViews。

UIScrollView.appearance().keyboardDismissMode = .onDrag

答案 1 :(得分:0)

对于this question,可以找到有关如何用各种答案为键盘重新签名的详尽讨论。

一种解决方案是使用列表中的UIApplication窗口上的方法来使列表中的拖动手势上的键盘失效。为了便于处理,我在UIApplication上创建了一个扩展,并为此扩展了view修饰符,最后为View创建了一个扩展:

extension UIApplication {
    func endEditing(_ force: Bool) {
        self.windows
            .filter{$0.isKeyWindow}
            .first?
            .endEditing(force)
    }
}

struct ResignKeyboardOnDragGesture: ViewModifier {
    var gesture = DragGesture().onChanged{_ in
        UIApplication.shared.endEditing(true)
    }
    func body(content: Content) -> some View {
        content.gesture(gesture)
    }
}

extension View {
    func resignKeyboardOnDragGesture() -> some View {
        return modifier(ResignKeyboardOnDragGesture())
    }
}

因此,退出键盘的最后一个修饰符只是一个必须像这样放置在列表中的修饰符:

List {
    ForEach(...) {
        //...
    }
}
.resignKeyboardOnDragGesture()

我还实现了搜索栏的纯swiftUI版本,这可能对您来说很有趣。您可以在this answer中找到它。

答案 2 :(得分:0)

Form {
    ...
}.gesture(DragGesture().onChanged { _ in
    UIApplication.shared.windows.forEach { $0.endEditing(false) }
})

答案 3 :(得分:0)

struct EndEditingKeyboardOnDragGesture: ViewModifier {
    func body(content: Content) -> some View {
        content.highPriorityGesture (
            DragGesture().onChanged { _ in 
                UIApplication.shared.endEditing()
            }
        )
    }
}

extension View {
    func endEditingKeyboardOnDragGesture() -> some View {
        return modifier(EndEditingKeyboardOnDragGesture())
    }
}