Mi avvicino all'animazione core e disegno empiricamente. Sto provando ad animare una forma semplice; la forma in questione è formata da 3 linee più una curva di bezier. Viene anche disegnata una linea rossa per mostrare i punti di controllo della curva.Animazione di una forma con CoreAnimation
alt text http://img.skitch.com/20091119-1ufar435jdq7nwh8pid5cb6kmm.jpg
mio controller principale aggiunge semplicemente questa visualizzazione secondaria e chiama il metodo adjustWave
ogni volta touchesEnd
. Ecco il codice per la mia classe di disegno della forma. Come vedi la classe ha una proprietà, cp1x (la x del bezeer control point 1). Questo è il valore che vorrei animare. Attenzione, questo è un tentativo stupido ...
- (void)drawRect:(CGRect)rect {
float cp1y = 230.0f;
float cp2x = 100.0f;
float cp2y = 120.0f;
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 10.0f, 200.0f);
CGPathAddCurveToPoint (path, NULL, cp1x, cp1y, cp2x, cp2y, 300.0f, 200.0f);
CGPathAddLineToPoint(path, NULL, 300.0f, 300.0f);
CGPathAddLineToPoint(path, NULL, 10.0f, 300.0f);
CGPathCloseSubpath(path);
CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextAddPath(ctx, path);
CGContextFillPath(ctx);
// Drawing a line from control points 1 and 2
CGContextBeginPath(ctx);
CGContextSetRGBStrokeColor(ctx,1,0,0,1);
CGMutablePathRef cp1 = CGPathCreateMutable();
CGPathMoveToPoint(cp1, NULL, cp1x, cp1y);
CGPathAddLineToPoint(cp1, NULL, cp2x, cp2y);
CGPathCloseSubpath(cp1);
CGContextAddPath(ctx, cp1);
CGContextStrokePath(ctx);
}
- (void)adjustWave {
[UIView beginAnimations:@"movement" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:@selector(didStart:context:)];
[UIView setAnimationDidStopSelector:@selector(didStop:finished:context:)];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:3.0f];
[UIView setAnimationRepeatCount:3];
[UIView setAnimationRepeatAutoreverses:YES];
cp1x = cp1x + 20.0f;
[UIView commitAnimations];
}
La forma non cambia. Se, al contrario, tolgo il codice CA e aggiungo un semplice `[self setNeedsDisplay] nell'ultimo metodo che la forma cambia, ma ovviamente senza CA. Puoi aiutare sme? Sono sicuro che sto facendo un errore molto semplice qui ... Grazie in anticipo, Davide
Come dice Brad, è possibile utilizzare la classe CAShapeLayer per animare una forma arbitraria costruendo un oggetto CABasicAnimation o CAKeyframeAnimation e animando con la proprietà 'path'. Ho scritto un post su questa classe se vuoi controllare il codice di esempio. http://bit.ly/shapelayer –