动画CALayer刻度而不模糊

时间:2010-06-20 07:03:07

标签: iphone core-animation calayer

我有一个实现drawInContext的CALayer:并绘制一个简单的圆圈,如下所示:

- (void)drawInContext:(CGContextRef)ctx
{
     CGContextScaleCTM(ctx, DrawingScale, DrawingScale);
     CGContextSetRGBFillColor (ctx, 1, 0, 0, 1);
     CGContextFillEllipseInRect (ctx, LocationRectangle);
}

我一直在尝试根据触摸事件增加圆圈大小的不同方法。我尝试过使用UIView beginAnimation系统和CABasicAnimation,但它们都模糊了图像。在我的阅读中,我发现这是因为CALayer似乎被视为这些选项的位图。

足够公平......但我希望缩放我的图形而不会模糊,例如使用矢量缩放。

因此,在我的代码中,我有一个“DrawingScale”属性。

是否有一种利用图层动画缩放此属性的简洁方法?或者这是人们用NSTimers(yuk)做的事情吗?

这可能是我可以使用Core Animation为自定义属性制作动画的一种情况吗? 如果是这样,我很想知道人们发现哪个例子是最好的,或者Apple文档的哪个部分可能是开始这个​​主题的好地方。

对于Mac / iOS上的图形来说,有很多方法可以让皮肤/画猫......?

2 个答案:

答案 0 :(得分:3)

在花了几天时间研究之后,我得到的一个解决方案是将一个名为“DrawingScale”的变量作为成员变量(就像它在Obj-C中调用的那样)并使用Core Animation来动画该属性。

- (void)drawInContext:(CGContextRef)ctx
{
    CGFloat size = (CGFloat)(DrawingScale*DEFAULT_SIZE);
    CGRect elipseRect = CGRectMake(xPos, yPos, size, size);
    CGContextStrokeEllipseInRect(ctx, elipseRect);
    CGContextFillEllipseInRect (ctx, elipseRect);
}

然后在一个事件中,我设置了一个动画:

-(void) : (CGPoint) location
{
    /* Set up an explicit animation to scale the players size up */
    CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"DrawingScale"];
    anim.fromValue = [NSNumber numberWithFloat: 1];
    anim.toValue = [NSNumber numberWithFloat: 5];
    anim.removedOnCompletion = YES;
    anim.duration = 0.1;
    anim.delegate = self;
    anim.fillMode = kCAFillModeForwards;
    anim.autoreverses = NO;
    [self addAnimation: anim forKey:@"ElipseGettingBigger"];
}

设置动画以将我的​​变量DrawingScale设置为1到5,并在0.1秒内完成。它的效果非常好。

我确实需要小心,并确保我首先相应地调整了图层边界!

答案 1 :(得分:2)

使用形状图层(CAShapeLayer)。您传递路径,填充颜色和笔触颜色,无论比例如何,它都会使您的所有边缘都清晰。如果你需要的只是一个圆圈,你可以欺骗并创建一个角度半径为宽度和高度的一半的层(假设是完美的方形/圆形)。类似的东西:

CALayer *layer = [CALayer layer];
[layer setMasksToBounds:YES];
[layer setBackgroundColor[[UIColor redColor] CGColor]];
[layer setCornerRadius:25.0f];
[layer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
[layer setPosition:CGPointMake([view bounds].size.width/2.0f, 
                               [view bounds].size.height/2.0f]);

[[view layer] addSublayer:layer];

您可能还想查看latest WWDC videos from Apple。 Core Animation上有三个会话。讨论层缩放并保持边缘清晰。视频是免费的。

最好的问候。