iOS添加点击手势到多个视图

时间:2011-06-04 15:40:54

标签: objective-c ios uiview ios4 uigesturerecognizer

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

  1. 如何在多个视图中注册相同的tapGesture?

  2. 让我们假设我已经开始工作,现在这些视图中的所有单击都会转到名为oneTap的同一个函数。在此功能中,我如何区分水龙头来自哪个视图?

  3. 代码:

    @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;
    }
    

7 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:12)

  1. Can you attach a UIGestureRecognizer to multiple views?否。

  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)与标签可能是更好的选择。

  3. P.S。明确设置numberOfTapsRequired& numberOfTouchesRequired1,因为它们默认设置为1。您可以通过按住Command并单击Xco​​de中的numberOfTapsRequired来确认这一点。

答案 2 :(得分:3)

1使用hitTest:

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

2将单个TapGesture添加到多个视图,只有最后一个视图有效。

答案 3 :(得分:1)

//在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
    }
}

//视图中的USE加载:         tapGestures(查看:view1)         tapGestures(查看:view2)         tapGestures(查看:view3)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

要将多个视图附加到同一手势,您可以在影响视图之前重新初始化该手势

这是一个迅速的例子

override func viewDidLoad() {
    super.viewDidLoad()

    var tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
    tap.numberOfTapsRequired = 1
    info1Btn.addGestureRecognizer(tap)
    info1Btn.tag = 1

    tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
    info2Btn.addGestureRecognizer(tap)
    info2Btn.tag = 2

    tap = UITapGestureRecognizer(target: self, action: #selector(infoTapped(sender:)))
    info3Btn.addGestureRecognizer(tap)
    info3Btn.tag = 3

}


  @objc func infoTapped(sender: UITapGestureRecognizer){
    let view:UIView = sender.view!
    switch (view.tag) {
    case 1:
        print(view.tag) //  info 1 tapped
    case 2:
        print(view.tag) //  info2 tapped

    case 3:
        print(view.tag) //  info 3 tapped

    default:
        break;
    }
}

答案 6 :(得分:0)

for index in 0..3 {
       let view = UIView()
       view.tag = index
       let gestureRecognizer = UITapGestureRecognizer(target: self, action:  #selector(self.viewTapped(_:)))
       view.addGestureRecognizer(gestureRecognizer)
       myViews.append(view)
    }

@objc func viewTapped( _ sender: UITapGestureRecognizer) { 
    guard let tappedView = sender.view as? SelectableFeeIKEABtnView else { return }
    for view in myViews {
        if tappedView.tag == view.tag {
          //Do something
        }
    }
}

在此示例中,有一个循环创建 4 个不同的视图,为它们分配相同的点击手势,并将它们附加到名为 myViews 的数组中。此外,为它们中的每一个设置不同的标签很重要,在这种情况下,我使用它们在数组中的位置(索引)作为标签。

一旦你有了标签的区别,你就可以在函数@objc func viewTapped(_ sender: UITapGestureRecognizer)中比较,如果点击的视图是你感兴趣的视图。