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