8

以下を実現したい。

シナリオ: ユーザーが特定のテキスト フィールドに入力している間、iOS キーボードが画面に表示されます。ユーザーは、キーボードとテキスト フィールド以外の場所をタップして、キーボードを閉じることができます (表示されているボタンをアクティブにする必要はありません)。また、ユーザーはキーボードの外側にドラッグして、スクロール可能なビューの配置で通常のドラッグ動作を観察できます。

概念的には、次UIViewのように動作するほとんどの画面に「カバー」を配置しています。

  1. ユーザーがカバーをタップすると、そのタップをキャプチャします (たとえば、キーボードを閉じることができるようにします)。これは、サブクラスでタッチ イベントをインターセプトするUIViewか、タップ ジェスチャ レコグナイザーを使用することで簡単に実現できます。

  2. ユーザーがカバーをドラッグすると、カバーはこれらのタッチを無視または転送します。これらは、カバーがない場合と同じように、下の層によって受け取られます。

したがって、ユーザーは表紙の下のコンテンツをスクロールできる必要がありますが、表紙の下のコンテンツをタップすることはできません。キーボードとテキスト フィールドの「外側」をタップすると、キーボード (およびカバー) が非表示になりますが、何もアクティブ化されません。

どうすればこれを達成できますか?

4

3 に答える 3

2

通常の方法でタップ ジェスチャを追加します。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.view addGestureRecognizer:tapGesture];

しかし、あなたが探しているのはこれです:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {    
        return YES;
    }

ドキュメンテーションによると: このメソッドは、gestureRecognizer または otherGestureRecognizer によるジェスチャの認識が、他のジェスチャ レコグナイザによるジェスチャの認識をブロックする場合に呼び出されます。( https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate )

このようにして、完全に透過的であり、レコグナイザーの呼び出しを妨げるものは何もないことを確認できます。

于 2012-11-16T08:45:08.437 に答える
1

受信したすべてのタッチを転送するカスタム ビュー:

class CustomView: UIView {

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {

        var hitView = super.hitTest(point, withEvent: event)

        if hitView == self {
            return nil
        }

        return hitView
    }    
}

そこから、さまざまな方法でタップ ジェスチャを利用できます。タッチの UIEvent を観察するか、ジェスチャ認識エンジンを使用します。

于 2015-08-27T17:15:17.367 に答える
0

1: ビューにタップ ジェスチャ レコグナイザーを追加します。

    //Adding tap gesture
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
    tapGesture.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:tapGesture];

2: handleTapGesture では、キーボードの FirstResponder に署名します

- (void)handleTapGesture:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateRecognized) {
       //Resign first responder for keyboard here
    }
}

上記の答えについて少し詳しく説明しました。UIGestureRecognizerStateRecognized は、認識される単一のタブ イベントであることを確認します。

これはあなたが求めている機能ですか?

于 2012-11-16T08:32:09.417 に答える