点击测试以避免子视图但希望其他子视图起作用

时间:2013-06-11 23:46:30

标签: iphone ios objective-c ipad cocoa-touch

我有一个背景子视图,它只有灰色,并且在它上面有可以拖动的瓷砖。这一切都发生在一个视图控制器中。问题在于,当我进行命中测试并尝试避开backgroundView时,因为切片位于该视图的顶部,所以它仍然会看到那些坐标并避免触摸移动事件,因为我返回nil。

以下是代码:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    for (UIView *view in self.subviews) {

        //This checks if touches are within the region of the custom view based on its cordinates.
        if (CGRectContainsPoint(view.frame, point)) {
            NSLog(@"touched the boat view %f %f and %f %f",view.frame.origin.x, view.frame.origin.y, point.x, point.y);

            if ([view isEqual:backgroundView])  {
                return nil;
            }
            else
                return view;
        }
    }

    return nil;
}

如果您可以看到我正在验证背景视图,但由于我的图块处于背景视图中,因此不会根据我的其他逻辑拖动它们。我已经尝试将userInteractiveEnabled设置为No,但是这不会起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你应该有一个uiview的子类,并在这个子类上实现hitTest:

@implementation EDPassTroughView

- (id)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self) {
    // Initialization code
   }
   return self;
}

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
   UIView *hitView = [super hitTest:point withEvent:event];
   if (hitView == self)
      return nil;
   else
      return hitView;
}

@end