iPhone Quartz2D рендеринг расширяющийся круг - PullRequest
1 голос
/ 14 июля 2010

Мне интересно, какой «правильный» метод для достижения следующих функциональных возможностей с помощью Quarts2D:

Я хочу иметь вид и иметь возможность добавлять круг по любой координате. Как только я добавлю круг, он должен расшириться с заданной скоростью; Я также хотел бы повторить этот процесс и иметь номер, если эти расширяющиеся круги.

Думайте о ракетном командовании:

Yellow spots keep expanding

Как правило, если бы я писал это на C ++, используя SDL или другую графическую библиотеку, я бы:

Есть класс для представления "растущего круга" Иметь вектор / массив для хранения указателей на все «растущие круги», которые я создаю.

Все диаметры окружностей будут увеличиваться с каждым тактом, и в моем цикле рендеринга я буду перебирать список и рисовать соответствующие круги в своем буфере.

Это, однако, не совсем соответствует тому, как я обычно использовал представления в предыдущей разработке для iPhone.

Так что я думаю, что это что-то вроде открытого, но есть ли «правильный» способ для чего-то подобного?

Будет ли это в стиле игрового цикла (как описано выше), или я должен иметь подкласс UIView для объекта 'circle' и переопределить drawRect? Думаю, мне нужно было бы добавить каждый круг, создав вид и добавив его в мой основной вид?

Первоначальное расследование также привело меня к ссылкам на класс CAShapeLayer , хотя я предполагаю, что это может быть почти таким же, как реализация техники подклассов UIView.

1 Ответ

2 голосов
/ 14 июля 2010

Вот один из способов сделать это.Добавьте следующий код в свой подкласс 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"];
}
...