【问题标题】:UITextfield hidden behind keyboard隐藏在键盘后面的 UITextfield
【发布时间】:2022-01-23 19:46:41
【问题描述】:

我正在构建一个包含搜索或 UITextField 的应用程序,它位于视图底部靠近安全区域的位置,因此当我触摸它并弹出键盘时,文本字段会隐藏在键盘后面。

我怎样才能使它在键盘弹出时文本字段移动到它的正上方? 这是我在 viewController.swift 中的代码


class ViewController: UIViewController {

    @IBOutlet weak var windLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!
    @IBOutlet weak var searchCItyTextField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        searchCItyTextField.delegate = self
    }
}
//MARK: - UITextFieldDelegate
extension UIViewController: UITextFieldDelegate {
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return true
    }
}

以下是截图:

【问题讨论】:

标签: ios swift xcode uitextfield


【解决方案1】:

使用IQKeyboardManager 在打开键盘时滚动 UITextField

举例

在 AppDelegate 中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    
    IQKeyboardManager.shared.enable = true 
    return true
  }

在视图控制器中

class ViewController: UIViewController {
  
  lazy var textField: UITextField! = {
    
    let textField = UITextField()
    textField.translatesAutoresizingMaskIntoConstraints = false
    textField.borderStyle = .roundedRect
    textField.placeholder = "Enter"
    return textField
    
  }()
    
  override var preferredStatusBarStyle: UIStatusBarStyle{
    return .darkContent
  }
  
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.view.backgroundColor = .white
    self.setConstraint()
    
  }
    
  func setConstraint(){
    
    self.view.addSubview(self.textField)

    NSLayoutConstraint.activate([
    
      self.textField.heightAnchor.constraint(equalToConstant: 60),
      self.textField.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width * 0.66),
      self.textField.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
      self.textField.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -10),
      
    ])

  }
  
}

输出:

【讨论】:

  • 虽然诸如IQKeyboardManager 之类的第 3 方类可能有用,但这并不能回答 OP 的问题。
  • 嗨@DonMag 我向他推荐 IQKeyboardManager 框架。它看起来框架对我来说工作正常。请参阅上面我更新的答案帖子。
  • 再说一次,这 可能 有用,但它并没有告诉 OP 任何关于 如何 管理它们的信息键盘。另外,假设IQKeyboardManager 的开发停止并且不再可用?您的建议完全适合评论 - 但它不能回答问题。
【解决方案2】:

您可以为文本字段的底部约束添加@IBOutlet,并在键盘出现/消失时更新它。例如,如果没有键盘,则从底部将其设置为-30,如果存在键盘,则将其更新为-keyboardHeight - 30。查看how this can be done here 的示例。

另一种方法是向上移动整个视图,例如使用UIScrollView,在键盘存在并向上滚动时增加其高度。

【讨论】:

    【解决方案3】:

    您可以为您观察键盘出现或消失,并更新您的界面

    例如:

    @objc func kbDidShow(notification: Notification) {
    
    
            guard let userInfo = notification.userInfo else { return }
    
            let kbFrameSize = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    
            yourTextField.bottomAnchor.constraint(equalsTo: self.view.bottomAnchor, constant: kbFrameSize.height + 50).isActive = true
            
        }
    
    @objc func kbDidHide() {
    
           yourTextField.bottomAnchor.constraint(equalsTo: self.view.bottomAnchor, constant: 50).isActive = true
    
        }
    
    override func viewDidLoad() {
            super.viewDidLoad()
    
            NotificationCenter.default.addObserver(self, selector: #selector(kbDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(kbDidHide), name: UIResponder.keyboardDidHideNotification, object: nil)
            
            
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多