質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2317閲覧

TextFieldのy座標が取得できない

pftyuk

総合スコア52

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/01/28 15:09

編集2020/01/29 14:48

前提・実現したいこと

こちらを参考にして、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座標が取得出来なかった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

convert()で合っていますが、どの順番で何のviewを設定するかで取得値が変わります。
下記の記事を参考にもう一度トライすることをおすすめします。
座標変換について swift

投稿2020/01/29 01:25

MasatoUchida

総合スコア134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pftyuk

2020/01/29 14:53

ご回答頂きありがとうございます。 ご提示頂いたリンク先を参考に、色々と試してみたところ 追記させて頂いた書き方で一旦問題なく動いている事が確認出来たのですが 果たしてこの書き方で合ってるのでしょうか・・・? convert()が少しややこしくてイマイチ理解が出来てないのですが 記事先にあるように、変換したいものは最初の引数に変換したいものは何から変換したいかは第二引数に なるように書いてみたのが、追記させて頂いたものなのですが、なぜself.view.convertになるのか イマイチ理解できてないので、ご面倒でなければご教示頂きたいです・・・。 質問自体は一旦解決していると思うのでベストアンサーとさせて頂きます。
MasatoUchida

2020/01/30 00:54

私も確証を持っては言えませんが、UIViewController内の話なのでUITextFieldをUIViewControllerの座標に変換する、という認識でいます。ですので、例えば赤いUIView内での座標がほしい場合は、 黄色いviewcontrollerの話.convert(テキストフィールド to:赤いview)になるのではないかと思います。 お役に立てれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問