检查uiView是否处理了触摸

时间:2016-04-08 00:21:15

标签: objective-c iphone uiview cocos2d-iphone touch

我想要做的是将UIView置于另一个UIView之上,并且两者都是屏幕尺寸。顶部UIView包含许多cocos节点,当我触摸它们时会响应。但是当我触摸没有cocos节点的地方时,底部UIView应该响应。 我不知道该怎么做。我的想象是检查顶部uiView是否处理触摸,什么都不做。另一方面让底部UIView开始回应。但我不知道如何检查。我只知道如何检查触摸,但是当我碰到一些无法处理的地方时,UIView似乎也会被触及。

2 个答案:

答案 0 :(得分:1)

我认为你不需要2次观看。

只需获取一个视图,然后将所有节点添加到该视图中。

in .h

IBOutlet UIView *bgView;//your view

UITapGestureRecognizer *viewTapRecognizer;// view tap recognizer

in .m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    viewTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handelGesture:)];
    [bgView addGestureRecognizer:viewTapRecognizer];

    for (UIView *subView in [bgView subviews]) {

        UITapGestureRecognizer *nodeTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handelGesture:)];

        [subView addGestureRecognizer:nodeTapRecognizer];
    }
}

- (void)handelGesture:(UITapGestureRecognizer*)sender {

    if (sender == viewTapRecognizer) {
        // your view is tapped
        NSLog(@"........Tapped view..........");
    }
    else {
        // your node is tapped
        NSLog(@"........Tapped node..........");
    }
}

试试这个。它可能适合你。

答案 1 :(得分:0)

您可以通过两种方式实现:使用 pointInside... 方法或 hitTest... 方法。
如果您将使用 pointInside ... ,则只能使用您的视图(顶视图和底视图)。您将使用顶视图继承UIView并覆盖 pointInside ... 方法。如果用户点击了cocoa节点,您将返回 YES ,否则返回 NO

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL inside = [self didUserTapCocoaNode:point];
    return inside;
}

如果你想要更复杂的逻辑,你应该使用第三个视图,UIView的子类(容器视图),它将包含顶视图和底视图。覆盖方法 hitTest ... ,并返回底部或顶部视图。

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event  
 {
    UIView* result = nil;
    if ([self touchedCocoaNode:point])
    {
      result = self.topView;
    }
    else
    {
      result = self.bottomView;
    } 

    return result;
 }

<强> UPD 带有伪代码的 didUserTapCocoaNode 的示例实现:

 - (BOOL)didUserTapCocoaNode:(CGPoint)pointInSelf
{
  __block BOOL tappedSomeNode = NO;
  [self.nodes enumerateObjectsUsingBlock:^(NodeType* obj, NSInteger idx, BOOL* stop){
     CGPoint pointInNode = [obj convertPoint:pointInSelf fromView:self];
     tappedSomeNode = [obj pointInside:pointInNode withEvent:nil];
     *stop = tappedSomeNode;
   }]
  return tappedSomeNode;
}