touchesBegan在动画期间不会触发,C4Shape在调整大小后失去参考

时间:2013-09-30 13:00:50

标签: iphone ios c4

我在附加代码时遇到两个问题。

首先,如果我将形状的动画持续时间设置为1秒,以便形状始终移动,则touchesBegan不会触发。当我查看C4View.m时,似乎UIViewAnimationOptionAllowUserInteraction未设置。有没有办法让我可以访问UIView来设置此选项?如果没有重写C4View,似乎很难。

http://iphonedevsdk.com/forum/iphone-sdk-development/64569-uiview-animatewithduration-blocks-the-screen-for-touch-input.html

其次,每次撞击形状时我都希望它缩小一点。我遇到的问题是,在我第一次停止移动后击中它。经过一些挖掘后,似乎C4Shape在用新框架重建后失去了它的形状。以下是控制台信息:

[C4Log] <C4Shape: 0x7b63820; baseClass = UIControl; 
frame = (263 691; 200 200); 
animations = { position=<CABasicAnimation: 0x1082c490>; 
animateFillColor=<CABasicAnimation: 0x8a62c00>; 
animateLineDashPhase=<CABasicAnimation: 0x8a64920>; 
animateStrokeColor=<CABasicAnimation: 0x8a64ef0>; 
animateStrokeEnd=<CABasicAnimation: 0x8a65190>; 
animateStrokeStart=<CABasicAnimation: 0x8a65430>; }; 
layer = <C4ShapeLayer: 0x7b63d00>>

之后:

[C4Log] <C4Shape: 0x1082d3a0; baseClass = UIControl; 
frame = (204 17; 180 180); 
layer = <C4ShapeLayer: 0x1082d4e0>>

首先将形状设置为nil,或者在重新定义后重新设置动画似乎不能解决问题。

CODE

//
//  C4WorkSpace.m
//  touchgame
//
//  Created by Adam Tindale on 2013-09-28.
//

#import "C4WorkSpace.h"

@implementation C4WorkSpace
{
    C4Shape * shape;
    C4Timer * timer;
    C4Label * text; 
    C4Font * font;
    int score;
}

-(void)setup
{
    score = 0;
    shape = [C4Shape ellipse:CGRectMake(self.canvas.center.x, self.canvas.center.y, 200, 200)];

    font = [C4Font fontWithName:@"Chalkduster" size:40];
    text = [C4Label labelWithText:@"Score : 0" font:font];

    [shape setAnimationDuration:0.05];
    timer = [C4Timer automaticTimerWithInterval:1.0 target:self method:@"runaway" repeats:YES];

    [self listenFor:@"touchesBegan" fromObject:shape andRunMethod:@"imhit"];

    [self.canvas addSubview:text];
    [self.canvas addSubview:shape];
}

-(void) runaway
{
    [shape setCenter:CGPointMake([C4Math randomIntBetweenA:0 andB:self.canvas.width], [C4Math randomIntBetweenA:0 andB:self.canvas.height])];

    C4Log(@"%@",shape);
}

-(void) imhit
{
    [text setText:[NSString stringWithFormat:@"Score: %d",++score]];
    [text sizeToFit];

    CGRect r = shape.frame;
    r.size = CGSizeMake(shape.size.width * 0.9, shape.size.height * 0.9);
    shape = [C4Shape ellipse:r];
}

@end

1 个答案:

答案 0 :(得分:2)

互动动画

C4Control / C4View / C4Window都有一个动画选项,允许用户在动画期间进行交互。它是C4AnimationOptions中可以找到C4Defines.h结构的一部分。

确保在开始制作动画之前调用此方法。

shape.animationOptions = ALLOWSINTERACTION;

而且,就像其他选项一样,它可以进行位掩码:

shape.animationOptions = EASEOUT | AUTOREVERSE | ALLOWSINTERACTION;

(你不必再修改C4View了!)

更改形状大小

要更改形状的大小,您需要在形状上调用方法,如下所示:

[shape ellipse:r];

以下......

shape = [C4Shape ellipse:r];

...由于三个原因不起作用:

  1. 通过调用C4Shape,您实际上是在创建一个新对象,而不会影响已存在的对象
  2. 通过设置shape = [...];,您将指针从原始形状更改为刚刚创建的新形状
  3. 屏幕上不存在新形状,停止的形状是您添加为子视图的原始形状。这就是原始形状停止移动的原因,因为您现在正在引用一个新对象。

  4. 以下代码是我上面所修改的版本:

    #import "C4WorkSpace.h"
    
    @implementation C4WorkSpace
    {
        C4Shape * shape;
        C4Timer * timer;
        C4Label * text;
        C4Font * font;
        int score;
    }
    
    -(void)setup
    {
        score = 0;
        shape = [C4Shape ellipse:CGRectMake(self.canvas.center.x, self.canvas.center.y, 200, 200)];
    
        font = [C4Font fontWithName:@"Chalkduster" size:40];
        text = [C4Label labelWithText:@"Score : 0" font:font];
    
        [shape setAnimationDuration:0.05];
        timer = [C4Timer automaticTimerWithInterval:1.0 target:self method:@"runaway" repeats:YES];
    
        [self listenFor:@"touchesBegan" fromObject:shape andRunMethod:@"imhit"];
    
        [self.canvas addSubview:text];
        [self.canvas addSubview:shape];
    }
    
    -(void) runaway {
        shape.animationOptions = ALLOWSINTERACTION;
        [shape setCenter:CGPointMake([C4Math randomIntBetweenA:0 andB:self.canvas.width], [C4Math randomIntBetweenA:0 andB:self.canvas.height])];
    
        C4Log(@"%@",shape);
    }
    
    -(void) imhit
    {
        [text setText:[NSString stringWithFormat:@"Score: %d",++score]];
        [text sizeToFit];
    
        CGRect r = shape.frame;
        r.size = CGSizeMake(shape.size.width * 0.9, shape.size.height * 0.9);
        [shape ellipse:r];
    }
    
    @end