前提・実現したいこと
ここに質問の内容を詳しく書いてください。
UITextFieldにKeyboardが重なるときだけ全体を上にスライドさせたいのですが、キーボードと重なる部分のTextFieldを開いてもスライドしません。エラーなどは出ていません。
どうすればいいでしょうか。
該当のソースコード
swift
1 2 32 43 54 65 76 87 98 109 1110 1211 1312 1413 15override func viewDidLoad() { 16 super.viewDidLoad() 17 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) 18 self.view.addGestureRecognizer(tapGesture) 19 } 20 21 override func viewWillAppear(_ animated: Bool) { 22 super.viewWillAppear(animated) 23 // Notificationを設定する 24 let nc = NotificationCenter.default 25 nc.addObserver(self, selector: #selector(self.keyboardWillShowNotification(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) 26 nc.addObserver(self, selector: #selector(self.keyboardWillHideNotification(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) 27 28 29 } 30 31 32 // NotificationCenterからのキーボード表示通知に伴う処理 33 @objc func keyboardWillShowNotification(_ notification: Notification) { 34 guard let textField = _activeTextField else { 35 return 36 } 37 let rect = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue 38 guard let keyboardHeight = rect?.size.height else { 39 return 40 } 41 let mainBoundsSize = UIScreen.main.bounds.size 42 let textFieldLimit = textField.frame.origin.y + textField.frame.height + 8.0 43 let keyboardLimit = mainBoundsSize.height - keyboardHeight 44 if keyboardLimit <= textFieldLimit { 45 let duration: TimeInterval? = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double 46 UIView.animate(withDuration: duration!, animations: { () in 47 self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardHeight) 48 }) 49 } 50 } 51 // NotificationCenterからのキーボード非表示通知に伴う処理 52 @objc func keyboardWillHideNotification(_ notification: Notification) { 53 let duration: TimeInterval? = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? Double 54 UIView.animate(withDuration: duration!, animations: { () in 55 self.view.transform = CGAffineTransform.identity 56 }) 57 } 58 59 // 編集中のTextFieldを保持する変数 60 private var _activeTextField: UITextField? = nil 61 // TextFieldの編集直後に呼ばれる 62 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 63 // 編集対象のTextFieldを保存する 64 _activeTextField = textField 65 return true; 66 } 67 //他の場所タップでキーボードを閉じる 68 @objc func dismissKeyboard() { 69 self.view.endEditing(true) 70 } 71
補足情報(FW/ツールのバージョンなど)
Swift5
Xcode12.5
あなたの回答
tips
プレビュー