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

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

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

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

Swift

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

Q&A

解決済

1回答

413閲覧

キーボード上にtextfieldを移動させる処理について

midori0822

総合スコア61

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/04/09 18:51

こんにちは。リンク内容このリンク先のとおりにタイトルの処理を実装しました。
実際に、キーボード上にtextfieldを移動させることには成功したのですがこのキーボードに2文字目を打ち込むとtextfieldが消えてしまいます(おそらくkeyboardWillHide()が働いています)。

2文字目でなくても予測変換選択時、事前に打ったtextの削除時、1文字目を打ちその後確定をおした時etc...
キーボードをタップする様々なアクション時にtextfieldが消えます。

これは一体何が起こっているのでしょうか。理想はキーボードの確定をタップした時に同時にtextfieldを下ろしたいです。

解決法が分かる方ぜひ回答をお待ちしております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

キーボード入力をした際に画面の再描画が行われ、キーボードの高さが考慮されない状態でテキストフィールドの高さが決まっているので、画面の下の方にずれるような動きをしています。
一応下記の方法でテキストフィールドは消えないようになりますが、キーボードが隠れた後にテキストフィールドの位置が少しずれます。(すいませんそこまでは調べきれていません。)

import UIKit class ViewController: UIViewController { let SCREEN_SIZE = UIScreen.main.bounds.size @IBOutlet weak var textField: UITextField! var isOpen = false // キーボードが表示されているかの判定 var height: CGFloat! // キーボードの高さ override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) //ここでUIKeyboardWillShowという名前の通知のイベントをオブザーバー登録をしている NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil) //ここでUIKeyboardWillHideという名前の通知のイベントをオブザーバー登録をしている } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } // 画面の描画ごとにテキストフィールドの高さを調整する override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if isOpen { textField.frame.origin.y = SCREEN_SIZE.height - self.height - textField.frame.height } } //Viewをタップした時に起こる処理を描く関数 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //キーボードを閉じる処理 view.endEditing(true) } //UIKeyboardWillShow通知を受けて、実行される関数 @objc func keyboardWillShow(_ notification: NSNotification){ let keyboardHeight = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.height textField.frame.origin.y = SCREEN_SIZE.height - keyboardHeight - textField.frame.height    // キーボードの高さを保存する self.height = keyboardHeight isOpen = true } //UIKeyboardWillShow通知を受けて、実行される関数 @objc func keyboardWillHide(_ notification: NSNotification){ textField.frame.origin.y = SCREEN_SIZE.height - textField.frame.height isOpen = false } }

個人的にはスクロールビューを使用した方が制御が楽だと思っていますので、参考記事を添付します。
何か参考になりましたら幸いです。
https://ameblo.jp/hayashidesuga/entry-11971210696.html
https://qiita.com/kobaboy/items/d56086b92f84c586562d

投稿2018/04/09 22:15

newmt

総合スコア1277

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

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

midori0822

2018/04/10 12:13

返信ありがとうございます! 上記の方法で解決しました!ありがとうございます! しかし、動きがかくつき、滑らかでないので上のリンクを元にscrollviewでの実装を目指しています。 リンク先ではtextfieldが編集される時に、textfieldのみを移動させてます。僕はkeyboard上へbuttonとtextfieldを同時に移動させるため、viewにその2つを配置し、そのviewを平行移動させようとしました。 (let txtLimit = txtActiveField.frame.origin.y + txtActiveField.frame.height + 8.0 のtxttxtActiveField→movingBox(2つの部品を配置したview) ) こうするとビルドはうまく行ったのですが、いざtextfieldを編集しようとするとクラッシュします。 これの原因はなんだと思いますか?差し出がましいようですが教えていただきたいです… 2つの部品の制約はmovingBoxのみに依存するよう設定してあります。
newmt

2018/04/10 21:38

エラーはどんなエラーが出ていますか?
midori0822

2018/04/11 07:16

返信おそくてすいません(-_-;) class AppDelegate: UIResponder, UIApplicationDelegate{  ← Thread 1: signal SIGABRT よく見るやつです…
newmt

2018/04/11 11:17

textFieldに対してstoryboardで何か設定していますでしょうか?そこらへんの設定が怪しいような気がします。(存在していないアクションか何かを紐づけているなど)
midori0822

2018/04/12 09:25

色々考えてみてもわからなかったので新しく質問してみることにします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問