1

我很好奇使用 Quarts2D 实现以下功能的“正确”方法:

我想要一个视图,并且能够在任何坐标处添加一个圆圈。一旦我添加了圆圈,它应该以预定义的速率扩展;我也想重复这个过程,如果这些扩大的圈子有一个数字。

想想导弹指挥部:

黄色斑点不断扩大

一般来说,如果我使用 SDL 或其他图形库在 C++ 中编写此代码,我会:

有一个类来代表一个“成长圈”有一个向量/数组来保存指向我创建的所有“成长圈”的指针。

每个刻度都会增加所有圆圈的直径,并且在我的渲染循环中,我将迭代列表并将适当的圆圈绘制到我的缓冲区。

然而,这似乎与我在以前的 iPhone 开发中通常使用视图的方式不太吻合。

所以我想这是一种开放式的,但是对于这样的事情有“正确”的方式吗?

它是游戏循环风格(如上所述),还是我应该UIView为“圆圈”对象子类化并覆盖drawRect?我想我必须通过创建一个视图并将其添加到我的主视图来添加每个圆圈?

初步调查还让我看到了对CAShapeLayer类的引用,尽管我猜这可能与实现 UIView 子类化技术大致相同。

4

1 回答 1

2

这是一种方法。将以下代码添加到您的 UIViewController 子类中,您将获得一个在您触摸到的任何地方都会变大然后逐渐消失的圆圈:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self addGrowingCircleAtPoint:[[touches anyObject] locationInView:self.view]];
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    if (flag && [[anim valueForKey:@"name"] isEqual:@"grow"]) {
        // when the grow animation is complete, we fade the layer
        CALayer* lyr = [anim valueForKey:@"layer"];
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
        animation.fromValue = [lyr valueForKey:@"opacity"];
        animation.toValue = [NSNumber numberWithFloat:0.f];
        animation.duration = .5f;
        animation.delegate = self;
        lyr.opacity = 0.f;  
        [animation setValue:@"fade" forKey:@"name"];
        [animation setValue:lyr forKey:@"layer"];
        [lyr addAnimation:animation forKey:@"opacity"];
    } else if (flag && [[anim valueForKey:@"name"] isEqual:@"fade"]) {
        // when the fade animation is complete, we remove the layer
        CALayer* lyr = [anim valueForKey:@"layer"];
        [lyr removeFromSuperlayer];
        [lyr release];
    }

}

- (void)addGrowingCircleAtPoint:(CGPoint)point {
    // create a circle path
    CGMutablePathRef circlePath = CGPathCreateMutable();
    CGPathAddArc(circlePath, NULL, 0.f, 0.f, 20.f, 0.f, (float)2.f*M_PI, true);

    // create a shape layer
    CAShapeLayer* lyr = [[CAShapeLayer alloc] init];
    lyr.path = circlePath;

    // don't leak, please
    CGPathRelease(circlePath);
    lyr.delegate = self;

    // set up the attributes of the shape layer and add it to our view's layer
    lyr.fillColor = [[UIColor redColor] CGColor];
    lyr.position = point;
    lyr.anchorPoint = CGPointMake(.5f, .5f);
    [self.view.layer addSublayer:lyr];

    // set up the growing animation
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    animation.fromValue = [lyr valueForKey:@"transform"];
    // this will actually grow the circle into an oval
    CATransform3D t = CATransform3DMakeScale(6.f, 4.f, 1.f);
    animation.toValue = [NSValue valueWithCATransform3D:t];
    animation.duration = 2.f;
    animation.delegate = self;
    lyr.transform = t;  
    [animation setValue:@"grow" forKey:@"name"];
    [animation setValue:lyr forKey:@"layer"];
    [lyr addAnimation:animation forKey:@"transform"];
}
于 2010-07-14T00:29:28.637 回答