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

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

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

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4169閲覧

入力フォームが移った際に表示位置を再調整する

tropfen

総合スコア12

iOS

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/15 08:37

キーボードを表示した際に入力欄(UITextView)が隠れてしまう問題に関する質問です。

ScrollView上に設置した2つの入力欄のうち、片方はキーボードが表示されると一部隠れる位置にあるため、NSNotification(UIKeyboadWillShowNotification)を使いキーボードが表示される際にScrollViewの位置調整を行っています。
キーボードが表示されていない状態でそれぞれを選択した場合は位置調整は正常に行われるのですが、位置調整の必要がない入力欄が編集モードの状態で、一部隠れている入力欄を選択した場合、選択した段階では位置の調整がかかりません。

一部隠れた状態で、何かしら入力すれば表示位置の調整は行われるのですが、できれば選択した時点で位置調整を行いたいです。

何か良い方法があればご教授願います。

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

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

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

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

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

guest

回答1

0

自己解決

スマートではありませんが、キーボードを表示した際にキーボードサイズを取得しておくようにし、検知できなかった場合のみ取得した値を元に位置を演算するようにしました。
また、検知する対象を「UIKeyboadWillShowNotification」ではなく「UIKeyboadWillChangeFrameNotification」に変更しました。
前者はキーボードが表示される際にしか発行されないため、キーボードが表示された後にサイズが変わる(変換候補欄など)場合に高さが再取得できず、結局入力欄が一部隠れてしまうためです。

TextViewを選択した際にキーボードが表示されると2回同じ計算をすることになりますが、ひとまず期待する動作を優先しています。

以下、実装したコードです。(必要な部分のみの抜粋)

lang

1class TestViewController: UIViewController { 2 var keyboardSize: CGFloat? 3 var activeView = UITextView() 4 @IBOutlet weak var scrollView: UIScrollView! 5 6 override func viewWillAppear(animated: Bool){ 7 super.viewWillAppear(animated) 8 NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChange:", name: UIKeyboardWillChangeFrameNotification, object: nil) 9 NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name:UIKeyboardWillHideNotification, object:nil) 10 } 11 12 override func viewDidDisappear(animated: Bool) { 13 super.viewWillDisappear(animated) 14 NSNotificationCenter.defaultCenter().removeObserver(self) 15 } 16 17 func keyboardWillChange(Notification: NSNotification) { 18 // UITextViewに合わせて画面をスクロール 19 let userInfo = Notification.userInfo! 20 let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue!).CGRectValue() 21 let myBoundSize = self.scrollView.bounds.size.height 22 let textLimit = self.actionView.frame.origin.y + self.actionView.frame.height 23 let kdbLimit = myBoundSize - keyboardFrame.size.height 24 if textLimit >= kdbLimit { 25 self.scrollView.contentOffset.y = textLimit - kdbLimit 26 } 27 // サイズ保持 28 self.keyboardHeight = keyboardFrame.size.height 29 } 30 31 func keyboardWillHide(hideNotification: NSNotification) { 32 self.scrollView.contentOffset.y = 0 33 self.keyboardHeight = nil 34 } 35 36 func textViewDidBeginEditing(textView: UITextView) { 37 // UITextViewに合わせて画面をスクロール 38 let myBoundSize = self.scrollView.bounds.size.height 39 let textLimit = textView.frame.origin.y + textView.frame.height 40 let kdbLimit = myBoundSize - self.keyboardHeight 41 if textLimit >= kdbLimit { 42 self.scrollView.contentOffset.y = textLimit - kdbLimit 43 } 44 } 45 46 func textViewShouldBeginEditing(textView: UITextView) -> Bool { 47 self.actionView = textView 48 return true 49 } 50}

投稿2016/06/16 09:58

tropfen

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問