web-dev-qa-db-ja.com

iOSが複数のビューにタップジェスチャを追加

メインビューで複数のビューが定義されています。これらすべてのビューにシングルタップジェスチャを追加したいと思います。以下は私が書いたコードですが、これは私が追加した最後のビューにタップジェスチャを登録します。したがって、以下のコードでは、tapはmessagesViewにのみ登録され、他のビューには登録されていません。 2つの質問があります:

  1. 同じtapGestureを複数のビューに登録するにはどうすればよいですか?

  2. これが機能すると仮定しましょう。これらのビューからのすべてのシングルタップは、oneTapと呼ばれる同じ関数に移動します。この関数では、タップがどのビューから来ているかをどのように区別しますか?

コード:

@synthesize feedsView, peopleView, messagesView, photosView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTap:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [feedsView addGestureRecognizer:singleTap];
    [peopleView addGestureRecognizer:singleTap];
    [messagesView addGestureRecognizer:singleTap];
    //[photosView addGestureRecognizer:singleTap];
    [singleTap release];

    return;
}
17

最後のビューに追加されただけの同じ問題がありました。より良い解決策があるかもしれませんが、ビューごとにタグジェスチャを作成し、それらを同じセレクターメソッドにリンクしました(oneTap:あなたの場合)。どのビューがメソッドをアクティブ化したかを区別するために、ビューにタグを付けることができます、feedsView.tag = 0; peopleView.tag = 1; 等々。次に、メソッドが呼び出されたとき:

- (void)oneTap:(UIGestureRecognizer *)gesture {
    int myViewTag = gesture.view.tag;  // now you know which view called
    // use myViewTag to specify individual actions;
}
26
justin
  1. IGestureRecognizerを複数のビューにアタッチできますか? いいえ。

  2. 2つのオプション:

    a)すべてのUIGestureRecognizerに独自のアクションを与えます。このアプローチの利点:強力なデカップリング。マイナス:より多くのコードの再利用。ただし、一般的な機能のメソッドを作成し、さまざまなアクションでメソッドを呼び出すだけで、コードの再利用を軽減できます。

    b)UIGestureRecognizerを追加するすべてのビューに一意のタグを付けます。次に、送信者のビューのタグをケースとして、一般的なアクションでswitchステートメントを使用します。プラス:コードの再利用が少なくなります。マイナス:より緊密な結合。このようなもの:

    UIGestureRecognizer *singleTap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
    [feedsView addGestureRecognizer:singleTap];
    feedsView.tag = 33;
    

    次に:

    - (void)singleTapAction:(UIGestureRecognizer *)singleTap {
        UIView *view = singleTap.view;
        switch (view.tag) {
            case 33
                // view is feedsView
                break;
    
            default:
                break;
        }
    }
    

    通常は分離するオプションを使用するのが最善ですが、すべてのアクションが非常に類似している場合は、ここに当てはまるようであり、今後も非常に類似していると確信している場合は、オプションb)を使用します。タグはおそらくより良い選択です。

P.S. numberOfTapsRequirednumberOfTouchesRequiredは両方ともデフォルトで1に設定されているため、明示的に1に設定する必要はありません。これを確認するには、Commandキーを押しながらXcodeのnumberOfTapsRequiredをクリックします。

12
ma11hew28

1 hitTestを使用します:

CGPoint location = [singleTap locationInView:self.view];
id testView = [self.view hitTest:location withEvent:nil];

2シングルTapGestureをマルチビューに追加します。最後のビューのみが機能しました。

3
Ken

計算されたプロパティを使用して、複数のビュー(この場合はUILabel)にワンタップジェスチャを追加します。呼び出しごとに新しい認識機能を作成します。

    var recognizer: UITapGestureRecognizer {
        get {
            return UITapGestureRecognizer(target: self, action: #selector(self.labelTapped(_:)))
        }
    }

    label1.addGestureRecognizer(recognizer)
    label2.addGestureRecognizer(recognizer)
    label3.addGestureRecognizer(recognizer)
    label4.addGestureRecognizer(recognizer)

およびlabelTapped関数

@objc func labelTapped(_ sender: UITapGestureRecognizer) {
    let tappedLabel:UILabel = (sender.view as! UILabel)
}
2
lev4

//タップジェスチャをSwift 4に追加します

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
    view.addGestureRecognizer(tap)
    view.isUserInteractionEnabled = true
    self.view.addSubview(view)

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    if sender.view == view1 {
       // do something
    }
    else{
       // do next thing
    }
}

//ビューでの使用が読み込まれました:tapGestures(view:view1)tapGestures(view:view2)tapGestures(view:view3)

2
kdhingra7