Objective-c对calayer进行了测试

时间:2014-01-24 23:30:04

标签: objective-c calayer

我有一个像这样的视图层次结构:

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中?

1 个答案:

答案 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]