CopyPastor

Detecting plagiarism made easy.

Score: 0.8044449727995567; Reported for: String similarity Open both answers

Possible Plagiarism

Plagiarized on 2021-07-11
by Yakir Zana

Original Post

Original - Posted on 2019-06-07
by rraphael



            
Present in both answers; Present only in the new answer; Present only in the old answer;

You need to use [Introspect](https://github.com/siteline/SwiftUI-Introspect) to receive access to UIScrollView and listen to keyboard height changes.
Here is a code:
import Combine import Introspect import SwiftUI struct SlidingKeyboardTest: View { @State var inputText = "Placeholder" @State var keyboardHeight = CGFloat(0) @State var scrollView: UIScrollView? = nil var body: some View { VStack { ScrollView { LazyVStack { ForEach(1 ... 100, id: \.self) { id in HStack { Spacer() Text("message \(id)") Spacer() } } } }.introspectScrollView { scrollView = $0 } TextEditor(text: $inputText) .frame(height: 50) }.onReceive(Publishers.keyboardHeight) { height in if height > 0 { self.scrollView!.setContentOffset(CGPoint(x: 0, y: self.scrollView!.contentOffset.y + height), animated: true) } else { self.scrollView!.contentOffset.y = max(self.scrollView!.contentOffset.y - keyboardHeight, 0) } keyboardHeight = height } .background(LinearGradient(gradient: Gradient(colors: [.white, .blue, .white]), startPoint: .top, endPoint: .bottom)) .onTapGesture { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } } struct SlidingKeyboardTest_Previews: PreviewProvider { static var previews: some View { SlidingKeyboardTest() } }

You can force the first responder to resign by sending an action to the shared application:
extension UIApplication { func endEditing() { sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } }
Now you can use this method to close the keyboard whenever you desire:
struct ContentView : View { @State private var name: String = "" var body: some View { VStack { Text("Hello \(name)") TextField("Name...", text: self.$name) { // Called when the user tap the return button // see `onCommit` on TextField initializer. UIApplication.shared.endEditing() } } } }
If you want to close the keyboard with a tap out, you can create a full screen white view with a tap action, that will trigger the `endEditing(_:)`:
struct Background<Content: View>: View { private var content: Content init(@ViewBuilder content: @escaping () -> Content) { self.content = content() } var body: some View { Color.white .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) .overlay(content) } } struct ContentView : View { @State private var name: String = "" var body: some View { Background { VStack { Text("Hello \(self.name)") TextField("Name...", text: self.$name) { self.endEditing() } } }.onTapGesture { self.endEditing() } } private func endEditing() { UIApplication.shared.endEditing() } }

        
Present in both answers; Present only in the new answer; Present only in the old answer;