キーボードがiPhoneのメッセージアプリに表示されているときに、ユーザーがメッセージのテーブルビューから下にスワイプしてキーボード領域に移動すると、キーボードが消え始めます。このプロセス中に指を上下に動かすと、キーボードも一緒に動きます。
AppleプライベートAPIでこれを行っていますか、またはジェスチャー認識機能から(私は推測します)からこのようなキーボードを制御する方法はありますか?
必要な機能を提供するUIViewカテゴリを作成しました。
https://github.com/danielamitay/DAKeyboardControl
編集:それは確かにアプリストアで使用されています。
幸いにも、AppleはkeyboardDismissMode
に便利なプロパティUIScrollView
を追加して、あなたの生活を少し楽にしました。
これで、ストーリーボードの1つのプロパティを変更するか、コードを1行追加するだけで、アプリをMessages.appのように動作させることができます。
このプロパティは、新しいUIScrollViewKeyboardDismissMode
enumを使用します。この列挙型の可能な値は次のとおりです。
UIScrollViewKeyboardDismissModeNone // the keyboard is not dismissed automatically when scrolling
UIScrollViewKeyboardDismissModeOnDrag // dismisses the keyboard when a drag begins
UIScrollViewKeyboardDismissModeInteractive // the keyboard follows the dragging touch off screen, and may be pulled upward again to cancel the dismiss
スクロール時にキーボードを非表示にするために変更するStoryboardプロパティは次のとおりです。
あなたの問題の解決に役立つことを願っています
これを行うには、UISwipeGestureRecognizerを使用できます。コードを使用して実装する方法はわかりませんが、新しいxcode 4.2ベータを使用している場合は、簡単な方法を次に示します。
- (IBAction)dismiss:(id)sender;
Xibのビューに移動し、ビューのクラスをUIControlに設定します。
UISwipeGestureRecognizerをライブラリからビューにドラッグして接続します。
IBAction(TouchDown)をUISwipeGestureRecognizerに接続します。
キーボードを閉じるコードを記述します。
- (IBAction)dismiss:(id)sender
{
[yourTextField resignFirstResponder];
}
できた!
Swiftでは、以下のコードを使用して、現在のキーボードのビューコンテナを取得できます(ifが存在する場合)、変更できるのはコード内のフレームです。
UIApplication.shared.windows
.filter{ NSStringFromClass($0.classForCoder) == "UIRemoteKeyboardWindow" }
.first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetContainerView" }
.first?.subviews.filter { NSStringFromClass($0.classForCoder) == "UIInputSetHostView" }
.first
ちなみに、ここには Reveal というツールがあり、ビューを階層的に表示できます。
テキスト入力コンテナの上に隠しボタンを配置するのが最善の方法だと思います。長いストリップで、タッチダウンを検出してリリースまたはキャンセルしてからキーボードを非表示にします。
やってみるつもりです。
短い答え;彼らはおそらく「プライベートAPI」のことをしているでしょう。
私は、キーボードがアプリのウィンドウの上にある独立したビューにあると確信しています(それにアクセス/制御することはできず、何があっても常に上部に表示されます)。できることのほとんどは、入力ビューをファーストレスポンダーステータスにする/辞任させることで、それに応じてキーボードが表示/非表示になります:すべてまたは何も。
キーボードビューのハンドルを取得してそのフレームプロパティを変更できる場合があります(ドキュメント化されたクラスのドキュメント化されていないプロパティ、およびドキュメント化されていないクラスを使用)。