キーボードの実際の高さを確実に取得するのに問題があります。キーボードの真上に配置するためのカスタムツールバーを追加しています。レイアウト制約を使用してこれを行うには、画面の下部とツールバーの下部の間に静的なスペース制約を追加しました。キーボードが表示されたら、この制約をキーボードの高さに変更します。これはiOS 8ではかなり異なります。
スペーサーのサイズを変更するには、現在UIKeyboardDidShowNotification
で起動される次のメソッドを使用します
-(void)keyboardDidShow:(NSNotification*)notification
{
CGFloat height = [[notification.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].height;
self.shimConstraint.constant = height;
[self.view layoutIfNeeded];
}
これにより制約のサイズが正しく変更される場合がありますが、返されるキーボードの高さは完全に正しくないことがよくあります。表示されたキーボードの高さを確実に取得する最良の方法は何ですか?
編集:このアプリケーションでは、ユーザーはさまざまな入力フィールドを切り替えることができます。それらの一部は自動修正が無効になっているため、自動修正バーが非表示になったり非表示になったりする場合があり、フィールドを切り替えると誤った高さが返されます。
その方法は正しいですが、UIKeyboardFrameBeginUserInfoKeyの代わりにUIKeyboardFrameEndUserInfoKeyを使用することもできます。エンドユーザーキーは、アニメーション化されて画面上で実行されるときのキーボードのフレームです。したがって、そのフレームになることがわかりますが、開始キーは、キーボードフレームが表示されるときに常に一致するとは限りません。
また、デバイスの向きについて特別な考慮が必要になる場合がありますが、私はそれを検討していませんが、ポートレートの場合は機能するはずです。
これを行う正しい方法は、UITextFieldのinputAccesorryViewプロパティを使用することです。
InputAccessoryViewは、キーボードのサイズに関係なく、キーボードの上に自動的に追加されます。
ドキュメントの状態:
このプロパティのデフォルト値はnilです。このプロパティにビューを割り当てると、テキストフィールドが最初のレスポンダーになったときに、そのビューが標準システムキーボードの上(またはカスタム入力ビューがある場合はその上)に表示されます。たとえば、このプロパティを使用して、カスタムツールバーをキーボードに接続できます。
必要な場合があります[self.view setNeedsLayout]
の代わりに [self.view layoutIfNeeded]
。