2010-06-20 57 views
3

我有一個實現drawInContext一個CALayer的:並繪製簡單的圓形,像這樣:動畫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上的圖形,有很多方法來皮膚/繪製一隻貓...?

回答

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

這是一個非常酷的修復程序;感謝分享。 – 2012-07-27 18:06:45

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中有三個會話。討論圖層縮放並保持邊緣清晰。這些視頻是免費的。

此致敬禮。

+0

感謝您的回答。目前它只是一個圓圈,但它會更多。但我喜歡創造性的解決方案:-)漂亮的小騙子。我將和CALayer一起玩! 有趣的是,你提到WWDC視頻,我剛剛看到了蘋果關於這些的電子郵件,並下載了幾個Gb值。現在我只需要花費很多時間來觀看它們:-) 我將發佈我一直在使用的解決方案 – Fuzz 2010-06-23 14:13:06