我有一个像这样的视图层次结构:
UIViewController* gameBoard
FEG_Navigator* vNavigation
FEG_Controller* vController1
FEG_Controller* vController2
在FEG_Controller中我用这段代码过来绘制rect:
- (void)drawRect:(CGRect)rect {
arc = [CAShapeLayer layer];
arc.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 50) radius:self.radius startAngle:M_PI endAngle:M_PI/150 clockwise:self.isClockwise].CGPath;
arc.position = CGPointMake(CGRectGetMidX(self.frame)-self.radius,
CGRectGetMidY(self.frame)-self.radius);
arc.fillColor = self.clrCircle.CGColor;
arc.cornerRadius = 0.5;
[self.layer addSublayer:arc];
}
在init中我有self.userInteractionEnabled = YES;
当我在gameBoard中启动控制器时,我向它们添加了轻击手势 -
//set up controllers
UITapGestureRecognizer* controller1Tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(moveTurret:)];
controller1 = [[FEG_RA_Controller alloc] initWithFrame:CGRectMake(-22, 3.0, 35.0, 35.0)];
[controller1 makeController:self.clrUserColor :35.0 :1.0:YES];
controller1.tag = 100;
[controller1 addGestureRecognizer:controller1Tap];
[vNavigator addSubview:controller1];
现在,所有moveTurret都会记录发件人视图的标签(UITapGestureRecognizer)。
我一无所获。所以我在互联网上挖了一个漂亮的网站,里面有一些有趣的东西,包括:
http://sketchytech.blogspot.com/2012/10/the-secret-life-of-calayer-part-2.html
所以CALayers不在响应者链中,这是有道理的。从概念上讲,我得到了作者所解释的内容,我只是在将它应用于我的情况时遇到了麻烦 - 应该在哪里触摸去?在FEG_Controller中?
答案 0 :(得分:0)
touchesEnded将在你的FEG_Controller中实现,我假设它是一个UIView子类。这可能只是一个错字,但你使用正确的子类?您已声明FEG_Controller并正在实现FEG_RA_Controller。只是确定。使用touchesEnded将一起取代轻敲手势识别器,基本上你将编写自己的手势识别器,这是不需要的(或者有益的,你将失去一些轻敲手势识别器的便利)。如果你想在你的视图控制器中保留你的手势识别器,那么只需检查你的moveTurret:
if ([arc containsPoint:[tap locationInView:self]])
//then move the turret
else
//don't
将手势识别器从FEG_Controller的帧移动到主视图控制器的边界:
[self.view addGestureRecognizer:controller1Tap]