UIView没有将触摸传递给子视图

时间:2012-06-30 16:43:26

标签: objective-c

我确信这是对响应链的一个基本误解 - 自iOS4以来它有变化吗?我有一些子视图的视图。 superview除了定位子视图之外没有其他目的,应该与处理触摸无关。我希望子视图能够听取触摸,但是superview似乎阻止了触摸事件。我认为超级视图传递到子视图?我已经阅读了几篇关于此的帖子,但我无法理解它。几个帖子似乎建议将superInview的userInteractionEnabled设置为NO可以正常工作,但是这样做似乎仍然无法触及。

如果我不清楚我的意思,这里有一些简化的代码。点击红色视图内部不会触发NSLog ...

@implementation ViewController
@synthesize redView;

- (void)viewDidLoad
{  
    UIView *blueView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 400)];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];
    redView = [[UIView alloc]initWithFrame:CGRectMake(20, 20, 40, 40)];
    redView.backgroundColor = [UIColor redColor];
    [blueView addSubview:redView];
    [super viewDidLoad];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    if (CGRectContainsPoint(redView.frame, touchPoint)) {
        NSLog(@"red got touched");
    }
}

@end

2 个答案:

答案 0 :(得分:0)

您正在接收的触摸坐标以封闭视图的坐标系表示。所以你需要用blueView的偏移来纠正它们。一种方法是将blueView属性添加到对象中,然后在touchesBegan方法中进行更正:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   UITouch *touch = [touches anyObject];
   CGPoint touchPoint = [touch locationInView:self.view];

   touchPoint.x -= blueView.frame.origin.x;
   touchPoint.y -= blueView.frame.origin.y;
   if (CGRectContainsPoint(redViewFrame, touchPoint)) {
      NSLog(@"red got touched");
   }
}

或者您可以将UIView子类化为blueView并覆盖touchesBegan

答案 1 :(得分:0)

我可以看到这里的错误在该方法的开始括号之后立即调用[super viewDidLoad]非常重要。其次,我可以建议你使用基于目标动作模式的手势识别器,并且使用起来非常简单。第三,你正在搞乱坐标系。