前提・実現したいこと
こちらを参考にして、UITextFieldがキーボードに重なってしまった際に
画面全体をズラす処理を実装したのですが、ルートのView上にTextFieldが乗っていない場合
TextFieldのyの座標がうまく取得出来ず、画面をズラすことが出来なくて困ってしまっています。
知りたい事としては、ルートのViewに対してのy座標を取得する方法が知りたいです。
調べても解決に至らなかったため、ご教示頂けると幸いです。
発生している問題・エラーメッセージ
ルートのView上にTextFieldが乗っていない場合、y座標が親Viewに対してのy座標になってしまう。
該当のソースコード
class Test2ViewController: TextFieldViewController { @IBOutlet weak var textField1: UITextField! @IBOutlet weak var textField2: UITextField! @IBOutlet weak var textFieldOnRed: UITextField! override func viewDidLoad() { super.viewDidLoad() self.textField1.delegate = self self.textField2.delegate = self self.textFieldOnRed.delegate = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setUpNotificationForTextField() } }
class TextFieldViewController: UIViewController, UITextFieldDelegate { private var activeTextField: UITextField? internal func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } internal func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { self.activeTextField = textField return true } internal func setUpNotificationForTextField() { let notificationCenter = NotificationCenter.default notificationCenter.addObserver(self, selector: #selector(self.handleKeyboardWillShowNotification(_:)), name: .UIKeyboardWillShow, object: nil) notificationCenter.addObserver(self, selector: #selector(self.handleKeyboardWillHideNotification(_:)), name: .UIKeyboardWillHide, object: nil) } @objc private func handleKeyboardWillShowNotification(_ notification: Notification) { let userInfo = notification.userInfo let keyboardSize = (userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue let keyboardY = self.view.frame.size.height - keyboardSize.height //self.activeTextField?.frame.origin.yで親Viewに対してのy座標が取得できるので //ルートのView上にさらにViewがあると、ViewContorollerのルートのViewに対してのy座標にならない //let editingTextFieldY: CGFloat = (self.activeTextField?.frame.origin.y)! //追記 guard let activeTextField = self.activeTextField else { return } let editingTextFieldY: CGFloat = self.view.convert(activeTextField.frame, from: activeTextField.superview).origin.y if editingTextFieldY > keyboardY - 60 { UIView.animate(withDuration: 0.25, delay: 0.0, options: .curveEaseIn, animations: { self.view.frame = CGRect(x: 0, y: self.view.frame.origin.y - (editingTextFieldY - (keyboardY - 60)), width: self.view.bounds.width, height: self.view.bounds.height) }, completion: nil) } } @objc private func handleKeyboardWillHideNotification(_ notification: Notification) { UIView.animate(withDuration: 0.25, delay: 0.0, options: .curveEaseIn, animations: { self.view.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height) }, completion: nil) } }
黄色いルートのView上のTextFieldに対しては、きちんと画面がズレる処理が働きますが
赤いView上のTextFieldに対しては、画面がズレる処理が働かないのでキーボードが被ってしまいました
試したこと
こちらのtextField.convert(...).origin.yを試したが、期待しているy座標が取得出来なかった
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 14:53
2020/01/30 00:54