Firasat Anda benar, ini sebenarnya cara terbaik untuk mengoptimalkan gambar. Saya telah melakukannya sendiri di mana saya memiliki beberapa latar belakang statis besar yang ingin saya hindari menggambar ulang ketika elemen dipindahkan ke atas.
Yang perlu Anda lakukan hanyalah menambahkan CALayer
objek untuk setiap item konten dalam tampilan Anda. Untuk menggambar lapisan, Anda harus mengatur tampilan Anda sebagai delegasi untuk setiap lapisan dan kemudian menerapkan metode drawLayer:inContext:
.
Dalam metode itu Anda cukup menggambar konten setiap lapisan:
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
if(layer == yourBackgroundLayer)
{
//draw your background content in the context
//you can either use Quartz drawing directly in the CGContextRef,
//or if you want to use the Cocoa drawing objects you can do this:
NSGraphicsContext* drawingContext = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES];
NSGraphicsContext* previousContext = [NSGraphicsContext currentContext];
[NSGraphicsContext setCurrentContext:drawingContext];
[NSGraphicsContext saveGraphicsState];
//draw some stuff with NSBezierPath etc
[NSGraphicsContext restoreGraphicsState];
[NSGraphicsContext setCurrentContext:previousContext];
}
else if (layer == someOtherLayer)
{
//draw other layer
}
//etc etc
}
Bila Anda ingin memperbarui konten salah satu lapisan, panggil saja [yourLayer setNeedsDisplay]
. Ini kemudian akan memanggil metode delegasi di atas untuk menyediakan konten lapisan yang diperbarui.
Perhatikan bahwa secara default, saat Anda mengubah konten lapisan, Core Animation menyediakan transisi fade yang bagus untuk konten baru. Namun, jika Anda menangani gambarnya sendiri, Anda mungkin tidak menginginkan ini, jadi untuk mencegah animasi pudar default saat konten lapisan berubah, Anda juga harus menerapkan metode delegasi actionForLayer:forKey:
dan mencegah animasi dengan mengembalikan a tindakan nol:
- (id<CAAction>)actionForLayer:(CALayer*)layer forKey:(NSString*)key
{
if(layer == someLayer)
{
//we don't want to animate new content in and out
if([key isEqualToString:@"contents"])
{
return (id<CAAction>)[NSNull null];
}
}
//the default action for everything else
return nil;
}
person
Rob Keniger
schedule
21.02.2012