完成例
TextFieldとキーボードが被った際に、Viewごと上に上げる方法を紹介します。
キーボードと一緒にViewも上げる方法を紹介している記事は複数あったのですが、
「キーボードとTextFieldが重ならい場合はViewを上げなくていいじゃん!」
って思ったので、チャレンジしてみたソースコードです。笑
キーボードとTextFieldが重ならない際は、Viewはピクリとも動かしません。
挙動は下のような感じです。
自分のPCで動作させたい場合は下記のGithubにコード載せているので、是非ご活用下さい。
https://github.com/MaedaKouta/MiniApp22-TextFieldWithViewUp
ソースコード
「keyboardWillShow」「keyboardWillHide」の2つのメソッドを準備して、
キーボードが起動した際・閉じた際に、それぞれのメソッドを呼び出しているイメージです。
「keyboardWillShow」のメソッドの中では、TextFieldの位置を座標で取得して、
キーボードに隠れるか、隠れないかの判定をしています。
import UIKit
class ViewController: UIViewController {
@IBOutlet private weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
// 画面に触れた際にキーボードを閉じる
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
@objc func keyboardWillShow(notification: NSNotification) {
guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
let noneMoveHeight = view.frame.origin.y + view.frame.size.height - keyboardSize.height
if noneMoveHeight <= textField.frame.midY {
if view.frame.origin.y == 0 {
view.frame.origin.y -= keyboardSize.height
} else {
let gapHeight = view.frame.origin.y + keyboardSize.height
view.frame.origin.y -= gapHeight
}
} else {
print("キーボードを動かす必要なし")
}
}
@objc func keyboardWillHide() {
if view.frame.origin.y != 0 {
view.frame.origin.y = 0
}
}
}
ということで、本記事はキーボードとTextFieldが重なると、Viewを上げる方法をご紹介しました。
本記事を書いている僕自身は、まだSwift初学者のためコードに至らない点が多いと思います。参考程度にご活用下さい。
アドバイスやコードの改善などあれば本記事の最後の部分からコメントしてくださいね。
最後まで読んでいただきありがとうございました!
おすすめSwift書籍
Swiftを学ぶなら、間違いのない2冊はこちら
リンク
リンク
Xcodeを学ぶなら下の一冊
リンク