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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1288閲覧

[swift]ドラッグして移動したTextfieldの座標を、キーボード表示時に取得したい。

Dave

総合スコア22

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/08/17 22:49

編集2020/08/19 10:59

MacOS Catalina 10.15.4
Xcode 11.6
Swift version 4

Textfieldをタップしてキーボードが表示される際、キーボードにTextfieldが隠れた時にだけ画面を上にずらしてTextfieldが表示されるようにしたいです。
ただそのTextfieldは別のボタンを押下時に生成され、かつUIPanGestureRecognizerを付与しているのでドラッグして移動可能にしています。ですので、座標が移動する度に異なります。
コードは以下のように記述してみたのですが、@objc func keyboardShow()でアクティブとなったTextfieldの座標を取得する方法が分かりませんでした。
色々サイトを見てみたのですが、ピンポイントな解決法が見当たらず…。

大変お手数ですが、良い方法があればご教示頂けませんでしょうか。
宜しくお願い致します。

swift4

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 7 var textfieldarray : [UITextField] = [] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 13 // キーボードを開く際に呼び出す通知 14 NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name:UIResponder.keyboardWillChangeFrameNotification, object: nil) 15 16 // キーボードを閉じる際に呼び出す通知 17 NotificationCenter.default.addObserver(self, selector: #selector(keyboardHide), name:UIResponder.keyboardWillHideNotification, object: nil) 18 19 } 20 21 22 // キーボード表示時、キーボードと予測変換部分の高さ分画面を上へずらす 23 @objc func keyboardShow(notification: NSNotification) { 24 if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 25 if self.view.frame.origin.y == 0 { 26 self.view.frame.origin.y -= keyboardSize.height 27 } else { 28 let suggestionHeight = self.view.frame.origin.y + keyboardSize.height 29 self.view.frame.origin.y -= suggestionHeight 30 } 31 } 32 } 33 34 // キーボード非表示時、画面を元の高さに 35 @objc func keyboardHide(){ 36 if self.view.frame.origin.y != 0 { 37 self.view.frame.origin.y = 0 38 } 39 } 40 41 override func viewWillDisappear(_ animated: Bool) { 42 super.viewWillDisappear(animated) 43 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil) 44 NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) 45 } 46 } 47 48 //画面をタップするとキーボードを閉じる 49 @IBAction func tapscreen(_ sender: Any) { 50 self.view.endEditing(true) 51 } 52} 53 54//Textfieldを生成するfunc 55 func createseat(){ 56 57 let textfield = UITextField() 58 59 seatarray.append(textfield) 60 61 //何番目に生成されたかによってx座標をずらす。 62 textfield.frame = CGRect(x: 50*seatarray.count, 63 y: 300, 64 width: 100, 65 height: 100) 66 67 // "UIPanGestureRecognizer"を付与 68 let panGetsture = UIPanGestureRecognizer(target: self, action: #selector(panAction)) 69 textfield.addGestureRecognizer(panGetsture) 70 71 // 以下の処理を入れることでタッチ許可する 72 textfield.isUserInteractionEnabled = true 73 74 self.view.addSubview(textfield) 75 } 76 77 // UITextfieldドラッグ時の処理 78 @objc func panAction(sender: UIPanGestureRecognizer) { 79 80 // ※引数の"sender"に、viewが含まれている。 81 let point: CGPoint = sender.translation(in: sender.view ) 82 83 let movedPoint = CGPoint(x:sender.view!.center.x + point.x, y:sender.view!.center.y + point.y) 84 sender.view?.center = movedPoint 85 86 87 // ドラッグで移動した距離をリセット 88 sender.setTranslation(CGPoint.zero, in: sender.view) 89 } 90 91//このボタンを押せばTextfieldを生成する 92@IBAction func seatplus(_ sender: Any) { 93 createseat() 94}

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://qiita.com/ysk_1031/items/3adb1c1bf5678e7e6f98
https://qiita.com/ShinokiRyosei/items/06fb30983236d6342b28
https://hayashi-rin.net/post-388#toc7
こちらのサイトを参考にしてみてはいかがでしょう

そのほかにも実際に実装していませんが、textfieldの位置を取得して、if文でその位置がキーボードの高さ以下か以上かで場合分してviewをずらすコードを書けばできると思います。

投稿2020/08/19 05:11

aya0514

総合スコア9

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

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

Dave

2020/08/19 10:13

ご回答ありがとうございます。上二つのサイトは拝見していました。 少し説明が足りなかったのですが、考えている仕様ではtextfieldは最初から配置しておらず、別のボタンを押して生成し、かつドラッグして移動できるようにしています。なので、移動する度に異なるtextfieldの座標を@objc func keyboardShow()で取得し、キーボードに被るかの判定したいのですが、当該funcにて取得する方法が分かりませんでした。 もしご存知でしたら、ご教示頂けると幸いです…。
aya0514

2020/08/21 02:57 編集

textfieldのy座標を取得したいのであれば、self.view.frame.origin.yであっていると思います。 @objc func keyboardShow()の中でself.view.frame.origin.y=0かそれ以外(>0)でif文を作成しているようですが、hiddenHightのような別の変数を作って hiddenHeight = キーボードの高さ + self.view.frame.origin.y - スクリーンの高さ とし、 if(hiddenHeight>0){viewをずらしてキーボード表示} else{キーボード表示} とすればうまくいくと思います。 やりたいことと違ってたらまた言ってください、理解力と説明力がなくすみません。 以下のサイトに若干類似しているようなものがありました。参考になればですが。 http://sunao-products.com/%E3%80%90xcode%E3%80%91textfield%E3%81%AE%E5%BA%A7%E6%A8%99%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E8%A1%A8%E7%A4%BA-1924
Dave

2020/10/27 23:14

こちら回答できておらず大変失礼しました。 実は上で再度質問させて頂いた後も試行錯誤したのですが、どうしても難しいと判断し、根本的に仕様変更してキーボードを使用しないようにしたため、対応する必要がなくなりました。そのままこちらのページを開いておらず、aya0514様が回答くださったことに気づきませんでした。大変申し訳ございません…。 今後もコードを書く上で類似の仕様を使うことがあるかと思いますので、是非参考にさせて頂きます。 引き続き宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問