iOS将tapGesture添加到多个视图

Sri*_*aju 17 objective-c uiview uigesturerecognizer ios4 ios

我在主视图中定义了多个视图.我想为所有这些视图添加单击手势.下面是我编写的代码,但这会将轻击手势注册到我添加的最后一个视图.因此,在下面的代码中,仅messagesView针对其他视图注册而不是其他视图.我有两个问题:

  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;
}
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 25

我有同样的问题,它只添加到最后一个视图.可能有更好的解决方案,但我只为每个视图创建了一个标记手势,并将它们链接到相同的选择器方法(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;
}
Run Code Online (Sandbox Code Playgroud)


ma1*_*w28 12

  1. 你能将UIGestureRecognizer附加到多个视图吗?没有.

  2. 两种选择:

    a)UIGestureRecognizer自己动手.这种方法很多:强大的解耦.缺点:更多代码重用.但是,您可以通过创建常用功能的方法来缓解代码重用,并在不同的操作中调用方法.

    b)为每个视图添加UIGestureRecognizer一个唯一标记.然后,在公共操作中使用switch语句,并将发件人视图的标记作为案例.优点:减少代码重用.缺点:更紧密的耦合.像这样的东西:

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

    然后:

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

    虽然通常最好选择去耦,但如果你的所有动作非常相似,这似乎就是这种情况,并且你很确定它们将来会保持非常相似,那么选项b)with标签可能是更好的选择.

PS没有必要明确设置numberOfTapsRequired&numberOfTouchesRequired,1因为它们都1默认设置为.您可以通过按住Command并numberOfTapsRequired在Xcode中单击来确认.


小智 5

使用计算属性将一个点击手势添加到多个视图(在本例中为 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)
Run Code Online (Sandbox Code Playgroud)

和 labelTapped 函数

@objc func labelTapped(_ sender: UITapGestureRecognizer) {
    let tappedLabel:UILabel = (sender.view as! UILabel)
}
Run Code Online (Sandbox Code Playgroud)