2011-07-21 34 views
6

Zaman içinde bir çalışma alanındaki çizgilerin animasyonunu içeren bir uygulama oluşturuyorum.Bir çizgiyi canlandırmanın en kolay yolu nedir?

CGContextSetStrokeColor(context, black); 
CGContextBeginPath(context); 
CGContextMoveToPoint(context, startPoint.x, startPoint.y); 
CGContextAddLineToPoint(context, finalPoint.x, finalPoint.y); 
CGContextStrokePath(context); 

... ve sonra sadece finalPoint güncelleyip setNeedsDisplay çağırmak için her 0.05 saniyede bir çalıştırmak için bir zamanlayıcı ayarı: Bu Benim şimdiki yaklaşım drawRect böyle bir kod kullanmaktır.

Bu yaklaşımı buluyorum (5ish satırın aynı anda hareket etmesi durumunda) uygulamayı yavaşlatır ve hatta yüksek bir yenileme sıklığında bile hala sarsıntılı görünür.

Bu çok basit çizgi çizimini animasyonlu bir çizgi üzerinde gerçekleştirmenin daha iyi bir yolu olmalı; yani, bir satırın x1, y1'den başlayıp belirli bir süre boyunca x2, y2'ye kadar uzanmasını istiyorum. Bunun için seçeneklerim neler? Bunu daha hızlı yapmalıyım ve bu tıkırtı zamanlayıcıdan kurtulmayı çok isterim.

Teşekkürler!

cevap

5

CAShapeLayers'ı ve CATransactions ve CABasicAnimation'ı birlikte kullanın.

ŞekilLayer'e belirli bir yol ekleyebilir ve oluşturmayı bırakabilirsiniz.

CAShapeLayer nesnesinin, strokeStart ve strokeEnd adı verilen iki özelliği vardır; bu, satırın sonu boyunca satırın nerede oluşturulacağını tanımlar. Varsayılanlar strokeStart için 0,0 ve strokeEnd için 1.0'dır.

Yolunuzu, strokeEnd başlangıçta 0.0 olarak başlayacak şekilde ayarlarsanız, hiçbir satır görmezsiniz.

Daha sonra, 0,01 ile 1,0 arasında, strokeEnd özelliğinde animasyon uygulayabilirsiniz ve çizginin uzunluğunu göreceksiniz.

bunu gibi, sınıf için bir işlev ekleyebilir, CAShapeLayer en örtük 0.25 s `varsayılan animasyon zamanlamasını değiştirmek için:

-(void)animateStrokeEnd:(CGFloat)_strokeEnd { 
    [CATransaction begin]; 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath]; 
    animation.duration = 2.0f; //or however long you want it to happen 
    animation.fromValue = [NSNumber numberWithFloat:self.strokeEnd]; // from the current strokeEnd value 
    animation.toValue = [NSNumber numberWithFloat:_strokeEnd]; //to the end of the path 
    [CATransaction setCompletionBlock:^{ self.strokeEnd = _strokeEnd }]; 
    [self addAnimation:animation forKey:@"animateStrokeEnd"]; 
    [CATransaction commit]; 
} 

Sen _strokeEnd değeri olarak 1.0f için 0.0f herhangi değer iletebilirsiniz.

setCompletionBlock:, animasyon tamamlandıktan sonra geçen değerin açıkça ayarlanmasını sağlar.

İlgili konular