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

 

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

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

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

 

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

  • Swift version 4.2.1
  • Xcode Version 10.1

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
        }
    }
}

 

以上!