代码之家  ›  专栏  ›  技术社区  ›  davbryn

iPhone Quartz2D渲染展开圆

  •  1
  • davbryn  · 技术社区  · 14 年前

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

    我想有一个观点,并能够添加一个圆在任何坐标。我一加上圆,它就应该以预定的速率扩展;我还想重复这个过程,如果这些扩展的圆有一个数字。

    想想导弹指挥部:

    Yellow spots keep expanding

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

    所有的圆直径将增加每个记号,并在我的renderloop我会迭代列表和绘制适当的圆到我的缓冲区。

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

    所以我想这是一种开放式的,但有没有一个'正确'的方式像这样的事情?

    UIView 对于“圆”对象,并重写 drawRect ? 我想我必须通过创建一个视图并将其添加到主视图来添加每个圆?

    CAShapeLayer 类,尽管我猜这可能与实现UIView子类化技术大致相同。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Art Gillespie    14 年前

    这里有一个方法。将以下代码添加到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"];
    }