0

我确定这是对响应者链的基本误解 - 自 iOS4 以来它是否发生了变化?我有一些子视图的视图。超级视图除了定位子视图之外没有其他用途,并且与处理触摸无关。我希望子视图监听触摸,但超级视图似乎阻止了触摸事件。我认为superviews将触摸传递给subviews?我已经阅读了几篇关于此的帖子,但我无法理解它。几篇文章似乎建议将超级视图的 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
4

2 回答 2

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 那里

于 2012-06-30T17:07:02.807 回答
0

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

于 2012-06-30T18:21:41.157 回答