我确信这是对响应链的一个基本误解 - 自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
答案 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]非常重要。其次,我可以建议你使用基于目标动作模式的手势识别器,并且使用起来非常简单。第三,你正在搞乱坐标系。