SwiftUI更新到ios14以后,我们使用Textfiled时,会发现键盘弹出时,会导致view上移。不知道是不是ios14的bug?
解决方法有两种:
struct ContentView: View { @State var text: String = "" var body: some View { VStack { // 必须要加Spacer 要不不好用 Spacer() TextField("asd", text: self.$text) .textFieldStyle(RoundedBorderTextFieldStyle()) Spacer() } .ignoresSafeArea(.keyboard, edges: .bottom) } }
利用GeometryReader GeometryReader { _ in ZStack { //PUT CONTENT HERE }.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) }
- 目前尝试最有用的方法,在最根的MainView使用GeometryReader包住ZStack。
struct MainView: View { var body: some View { GeometryReader { _ in ZStack{ if A { Aview() } else if B { Bview() } }.edgesIgnoringSafeArea(.all)} } }
- 还有用.ignoresSafeArea(.keyboard, edges: .bottom)的写法
例1 struct ContentView: View { @State var text: String = "" var body: some View { if #available(iOS 14.0, *) { VStack { content } .ignoresSafeArea(.keyboard, edges: .bottom) } else { VStack { content } } } @ViewBuilder var content: some View { Spacer() TextField("asd", text: self.$text) .textFieldStyle(RoundedBorderTextFieldStyle()) Spacer() } } 例2 struct ContentView: View { @State var text: String = "" var body: some View { GeometryReader { _ in ... } .ignoresSafeArea(.keyboard, edges: .bottom) } } 例3 struct ContentView: View { @State var text: String = "" var body: some View { VStack { Spacer() TextField("asd", text: self.$text) .textFieldStyle(RoundedBorderTextFieldStyle()) Spacer() } .ignoresSafeArea(.keyboard, edges: .bottom) } }
键盘输入时,可能会遮挡入力框,我们可以活用inputAccessoryView
代码如下
struct NumberTextfield: UIViewRepresentable { @Binding var text: String @State var textbar: UITextField = UITextField(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) func makeUIView(context: Context) -> UITextField { let view = UITextField() view.setLeftPaddingPoints(10) view.isUserInteractionEnabled = true view.backgroundColor = uiColorF9F9F9 view.layer.borderColor = uiColorF9F9F9.cgColor view.layer.borderWidth = 1 view.layer.cornerRadius = 4 view.textColor = uiColor666666 view.delegate = context.coordinator view.keyboardType = UIKeyboardType.numberPad view.clearButtonMode = .whileEditing view.frame = CGRect(x: 0, y: 0, width: 30, height: 40) textbar.font = UIFont.systemFont(ofSize: 23) textbar.backgroundColor = UIColor.init(red: 245 / 255, green: 245 / 255, blue: 245 / 255, alpha: 1) textbar.isEnabled = false view.inputAccessoryView = textbar return view } func updateUIView(_ uiView: UITextField, context: Context) { uiView.text = text textbar.text = uiView.text } func makeCoordinator() -> NumberTextfield.Coordinator { Coordinator(self) } class Coordinator: NSObject, UITextFieldDelegate { var control: NumberTextfield init(_ control: NumberTextfield) { self.control = control } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { self.control.text = textField.text! return true } func textFieldDidChangeSelection(_ textField: UITextField) { if((textField.text?.count)! > 10) { textField.text! = String(textField.text!.prefix(10)) } self.control.text = textField.text! } } }
struct TextAreaView: UIViewRepresentable { @Binding var text: String @State var textbar: UITextView = UITextView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 100)) func makeUIView(context: Context) -> UITextView { let view = UITextView() view.isScrollEnabled = true view.isEditable = true view.font = UIFont.systemFont(ofSize: 15) view.isUserInteractionEnabled = true view.layer.cornerRadius = 4 view.backgroundColor = uiColorF9F9F9 view.delegate = context.coordinator view.keyboardType = .default textbar.isScrollEnabled = true textbar.isEditable = false textbar.isUserInteractionEnabled = false textbar.textContainerInset = UIEdgeInsets(top: 8, left: 4, bottom: 8, right: 4) textbar.font = UIFont.systemFont(ofSize: 19) textbar.backgroundColor = UIColor.init(red: 245 / 255, green: 245 / 255, blue: 245 / 255, alpha: 1) view.inputAccessoryView = textbar return view } func updateUIView(_ uiView: UITextView, context: Context) { textbar.text = uiView.text } func makeCoordinator() -> TextAreaView.Coordinator { Coordinator(self) } class Coordinator: NSObject, UITextViewDelegate { var control: TextAreaView init(_ control: TextAreaView) { self.control = control } func textViewDidChange(_ textView: UITextView) { self.control.text = textView.text! self.control.textbar.text = textView.text! //let range = NSMakeRange(textView.text.count - 1, 0) self.control.textbar.scrollRangeToVisible(textView.selectedRange) } } }