点击自定义UIView会触发错误的选择器

时间:2016-01-13 15:47:18

标签: ios objective-c uitapgesturerecognizer xcode7.2

我在超级视图上有2个自定义绘制的子视图,2个手势识别器可以调用2种不同的方法。问题是,当我点击任何一个视图时,点击第二个子视图仍然会触发第一个方法!这是我的代码:

- (void) addTapGestures{
self.firstTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(firstSelector)];
self.firstTap.numberOfTapsRequired = 1;
[self.firstSubview addGestureRecognizer:self.firstTap];

self.secondTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(secondSelector)];
self.secondTap.numberOfTapsRequired = 1;
[self.secondSubview addGestureRecognizer:self.secondTap];

会欣赏任何提示!

3 个答案:

答案 0 :(得分:1)

您可以使用UIView的hitTest方法获取tapped视图。基于此,您可以决定应该调用哪种方法。将此方法放在包含两个子视图的superview中。 这是一个例子。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
   UIView *hitView = [super hitTest:point withEvent:event];

   if ([self.firstSubView isEqual:hitView])
   {
       // You clicked on firstSubView, by returning firstSubView it will call its respective selector method
       return self.firstSubView;
   }
   else if ([self.secondSubView isEqual:hitView])
   {
      return self.secondSubView;
   }

   return hitView;
}

答案 1 :(得分:0)

回答我的评论。我能想到的常见问题:
1)self.firstSubview等于self.secondSubview
2)视图重叠和/或在其中一个上禁用用户交互。
第二个结果是一个问题。

答案 2 :(得分:0)

Swift 2.0:

尝试: -

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    view.endEditing(true)
    super.touchesBegan(touches, withEvent: event)

//make condition here
}

OR

使用UIPanGestureRecognizer。在ViewController中,在“父”视图上安装识别器。

var pan = UIPanGestureRecognizer(target:self, action:"pan:")
pan.maximumNumberOfTouches = 1
pan.minimumNumberOfTouches = 1
self.view.addGestureRecognizer(pan)

在识别器操作中,首先获取事件的位置。然后,根据识别器的状态,实现拖动功能的不同部分。

func pan(rec:UIPanGestureRecognizer) {            
        var p:CGPoint = rec.locationInView(self.view)
        var center:CGPoint = CGPointZero

        switch rec.state {
        case .Began:
            println("began")
            self.selectedView = view.hitTest(p, withEvent: nil)
            if self.selectedView != nil {
                self.view.bringSubviewToFront(self.selectedView!)
            }
case .Changed:
            if let subview = selectedView {
                center = subview.center
                var distance = sqrt(pow((center.x - p.x), 2.0) + pow((center.y - p.y), 2.0))
                println("distance \(distance)")

            if subview is MyView {
                if distance > threshold {
                    if shouldDragX {
                        subview.center.x = p.x - (p.x % snapX)
                    }
                    if shouldDragY {
                        subview.center.y = p.y - (p.y % snapY)
                    }
                }
            }
        }
case .Ended:
   if let subview = selectedView {
      if subview is MyView {
          // do whatever
      }
   }
   // must do this of course
   selectedView = nil
}