miyazaki-dev

【Swift】UITextFieldがキーボードに隠れないようにする方法

Swift

UITextfieldを下の方に設置するとキーボードで隠れて何入力してるかわからないみたいなことがある。

そんなときにtextfieldをずらしてあげる必要があるんですよね。面倒臭い。

見た方が速いですね。こういうの(背景色をグレーでtextfieldを白くしてます)

SwiftでUITextFieldが隠れる

デフォルトは、よしなにやってくれればいいのに、、と思いながら実装してます。

SwiftでUITextFieldが隠れないようにする

UITextfieldをキーボード隠さないようにする

コメントである程度補足してるのでコピペでなんとか実行してみてください。

class ViewController: UIViewController, UITextFieldDelegate, UIScrollViewDelegate {
    
  let sampleTextField: UITextField = UITextField()
  var scrollView = UIScrollView()
    
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // Notificationの発行
    self.configureObserver()
  }
    
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = UIColor.gray
        
    self.sampleTextField.delegate = self
    self.scrollView.delegate = self
        
    self.scrollView.frame.size = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        
    // textfieldにplaceholderを設置
    self.sampleTextField.placeholder = "text field"
        
    // textfieldの枠を表示する.
    self.sampleTextField.borderStyle = UITextField.BorderStyle.roundedRect
        
    // UITextFieldの表示する位置を設定する.
    self.sampleTextField.frame = CGRect(x: 100,y: 700,width: 200,height: 30)
    // scrollViewを設置
    self.scrollView.addSubview(self.sampleTextField)
        
    self.view.addSubview(self.scrollView)
  }
    
  //returnが押されたときに呼ばれる.
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
  }
    
  // Notificationを設定
  func configureObserver() {
        
    let notification = NotificationCenter.default

    notification.addObserver(
      self,
      selector: #selector(self.keyboardWillShow(notification:)),
      name: UIResponder.keyboardWillShowNotification,
      object: nil
    )
        
    notification.addObserver(
      self,
      selector: #selector(self.keyboardWillHide(notification:)),
      name: UIResponder.keyboardWillHideNotification,
      object: nil
    )
  }
    
  // Notificationを削除
  func removeObserver() {
    NotificationCenter.default.removeObserver(self)
  }
    
  // キーボードが現れたときにviewをずらす
  @objc func keyboardWillShow(notification: Notification?) {
    let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
    let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double
    UIView.animate(withDuration: duration!) {
      self.view.transform = CGAffineTransform(translationX: 0, y: -(rect?.size.height)!)
    }
  }
    
  // キーボードが消えたときにviewを戻す
  @objc func keyboardWillHide(notification: Notification?) {
    let duration: TimeInterval? = notification?.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? Double
    UIView.animate(withDuration: duration!) {
      self.view.transform = CGAffineTransform.identity
    }
  }
}

以上!