画面下にtextFieldやtextViewを配置すると、キーボード出現時に隠れてしまうことがある。
キーボード出現と一緒に、textFieldの位置を上げることで解決。
キーボード出現時にtextFieldを上げる方法
UIResponderのkeyboardWillShowとkeyboardWillHideを使い、キーボード出現時とキーボードが隠れた時にviewの高さを変える。
NotificationCenterで検知する。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//デリゲート
textField.delegate = self
//キーボードが出現を検知して、行う処理を指定
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
//キーボードが閉じたのを検知して、行う処理を指定
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
//キーボードのframeに変化がある時に呼ばれるメソッド
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
//キーボドが初めて出てきた時(viewが初期位置)
if self.view.frame.origin.y == 0 {
//キーボードの高さ分viewを上に移動する
self.view.frame.origin.y -= keyboardSize.height
} else {//キーボードはすでに出ている時(viewがキーボード分上がっている)
//予測変換部分の高さ分viewを上に移動する
let suggestionHeight = self.view.frame.origin.y + keyboardSize.height
self.view.frame.origin.y -= suggestionHeight
}
}
}
//キーボードが隠れた時に呼ばれるメソッド
@objc func keyboardWillHide() {
//viewが初期位置でない場合、0に戻す
if self.view.frame.origin.y != 0 {
self.view.frame.origin.y = 0
}
}
//return押下でキーボードを閉じる
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return false
}
}