web-dev-qa-db-ja.com

スワイプジェスチャーでキーボードを閉じる(メッセージアプリの場合と同様)

キーボードがiPhoneのメッセージアプリに表示されているときに、ユーザーがメッセージのテーブルビューから下にスワイプしてキーボード領域に移動すると、キーボードが消え始めます。このプロセス中に指を上下に動かすと、キーボードも一緒に動きます。

AppleプライベートAPIでこれを行っていますか、またはジェスチャー認識機能から(私は推測します)からこのようなキーボードを制御する方法はありますか?

31
Michael Stet

必要な機能を提供するUIViewカテゴリを作成しました。

https://github.com/danielamitay/DAKeyboardControl

編集:それは確かにアプリストアで使用されています。

44
Daniel Amitay

最も簡単な解決策は、次の2つのプロパティを設定することです。

ブーム、ベイビー!

チェックアウト AcaniチャットiPhoneクライアントChatViewController.Swift の例。

31
ma11hew28

幸いにも、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プロパティは次のとおりです。

enter image description here

あなたの問題の解決に役立つことを願っています

26
Miguel Carvajal

IOS 7では、UIScrollViewでインタラクティブにキーボードを閉じることができます。

IScrollViewでキーボードを閉じる

それが誰かを助けることを願っています。

10
Jeremy Massel

これを行うには、UISwipeGestureRecognizerを使用できます。コードを使用して実装する方法はわかりませんが、新しいxcode 4.2ベータを使用している場合は、簡単な方法を次に示します。

  1. IBActionを作成します。

- (IBAction)dismiss:(id)sender;

  1. Xibのビューに移動し、ビューのクラスをUIControlに設定します。

  2. UISwipeGestureRecognizerをライブラリからビューにドラッグして接続します。

  3. IBAction(TouchDown)をUISwipeGestureRecognizerに接続します。

  4. キーボードを閉じるコードを記述します。

    - (IBAction)dismiss:(id)sender 
    
    {
    
      [yourTextField resignFirstResponder];
    
    }
    

できた!

5
JonasG

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 というツールがあり、ビューを階層的に表示できます。

2
mangonob

テキスト入力コンテナの上に隠しボタンを配置するのが最善の方法だと思います。長いストリップで、タッチダウンを検出してリリースまたはキャンセルしてからキーボードを非表示にします。

やってみるつもりです。

0
Bassem

短い答え;彼らはおそらく「プライベートAPI」のことをしているでしょう。

私は、キーボードがアプリのウィンドウの上にある独立したビューにあると確信しています(それにアクセス/制御することはできず、何があっても常に上部に表示されます)。できることのほとんどは、入力ビューをファーストレスポンダーステータスにする/辞任させることで、それに応じてキーボードが表示/非表示になります:すべてまたは何も。

キーボードビューのハンドルを取得してそのフレームプロパティを変更できる場合があります(ドキュメント化されたクラスのドキュメント化されていないプロパティ、およびドキュメント化されていないクラスを使用)。

0
Nicolas Miari