Questa è la vostra classe personalizzata:
@implementation MyLayer
-(id)init
{
self = [super init];
if (self != nil)
self.actions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNull null], @"bounds",
nil];
return self;
}
-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBFillColor(context,
drand48(),
drand48(),
drand48(),
1);
CGContextFillRect(context,
CGContextGetClipBoundingBox(context));
}
+(BOOL)needsDisplayForKey:(NSString*)key
{
if ([key isEqualToString:@"bounds"])
return YES;
return [super needsDisplayForKey:key];
}
@end
sono queste aggiunte al modello Xcode 4.2 di default:
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// create and add layer
MyLayer *layer = [MyLayer layer];
[self.window.layer addSublayer:layer];
[self performSelector:@selector(changeBounds:)
withObject:layer];
return YES;
}
-(void)changeBounds:(MyLayer*)layer
{
// change bounds
layer.bounds = CGRectMake(0, 0,
drand48() * CGRectGetWidth(self.window.bounds),
drand48() * CGRectGetHeight(self.window.bounds));
// call "when idle"
[self performSelector:@selector(changeBounds:)
withObject:layer
afterDelay:0];
}
----------------- modificato:
Ok ... questo non è quello che hai chiesto :) Sorry: |
----------------- modificato (2):
E perché si avrebbe bisogno una cosa del genere? (void)display
può essere utilizzato, ma la documentazione dice che è lì per l'impostazione self.contents
...
Un'altra cosa che non funziona: sottoclasse e sovrascrittura 'setFrame',' setBounds' e 'setPosition'. Non vengono chiamati durante l'animazione. –
Non ti capisco del tutto. Cosa stai cercando di animare? Solo i limiti di CALAYER o qualcos'altro? L'animazione dei limiti è un'operazione abbastanza semplice, l'animazione dei fotogrammi è più complessa. – beryllium
Immagina che il tuo livello contenga qualcosa come un pulsante con una grafica complessa ma indipendente dalle dimensioni. Se lo si anima per dire il doppio della larghezza, si animerà usando il ridimensionamento bitmap, diventando allungato e pixelato durante l'animazione, anche se si ha 'needsDisplayOnBoundsChange' YES. Solo il frame finale sarà reso correttamente con 'drawInContext:'. –