Estoy tratando de construir un círculo de animación que se dibuja en sentido horario hasta que se convierte en círculo completo como se ilustra en iPhone Core Animation - Drawing a CircleCALayer como subcapa no visible
problema es que CALayer
objeto no se añade o construir. Probé y vi que no está accediendo a mis métodos drawInContext:CGContextRef
y animatingArc
.
lo que hasta ahora he hecho es:
En AnimateArc.h
@interface AnimateArc : CALayer {
CAShapeLayer *circle;
}
-(void) animatingArc;
@end
En AnimateArc.m
-(void) drawInContext:(CGContextRef)ctx
{
CGFloat radius = 50.0;
circle = [CAShapeLayer layer];
//make a circular shape
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, 2 * radius, 2 * radius) cornerRadius:radius].CGPath;
CGPoint centerPoint = CGPointMake(CGRectGetWidth(self.bounds)/2, CGRectGetHeight(self.bounds)/2);
//center the shape in self.view
circle.position = centerPoint;
//configure appearence of circle
circle.fillColor = [UIColor clearColor].CGColor;
circle.strokeColor = [UIColor blackColor].CGColor;
circle.lineWidth = 5;
/*CGPointMake((self.contentsCenter.size.width), (self.contentsCenter.size.height));*/
//path the circle
CGContextAddArc(ctx, centerPoint.x, centerPoint.y, radius, 0.0, 2 * M_PI, 0);
CGContextClosePath(ctx);
//fill it
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextFillPath(ctx); }
//////// ////////////////////////////////////////////////// /////////////
-(void) animatingArc
{
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"arcEnd"];
anim.duration = 20.0; //animate over 20 seconds
anim.repeatCount = 1.0; //animate only once
anim.removedOnCompletion = NO; //Reamin there after completion
//animate from start to end
anim.fromValue = [NSNumber numberWithFloat:50.0f];
anim.toValue = [NSNumber numberWithFloat:150.0f];
//experiment with timing to get appearence to look the way you want
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
//add animation to circle
[circle addAnimation:anim forKey:@"animatingArc"];
}
/////////////////////
//needed since key not part of animatable properties
+(BOOL) needsDisplayForKey:(NSString *)key
{
if([key isEqualToString:@"arcEnd"])
return YES;
else
return [super needsDisplayForKey:key];
}
//ensure custom properties copied to presentation layer
-(id) initWithLayer:(id)layer
{
if((self = [super initWithLayer:layer]))
{
if ([layer isKindOfClass:[AnimateArc class]])
{
AnimateArc *other = (AnimateArc *) layer;
[other setNeedsDisplay];
}
}
return self; }
Y, finalmente, en mi viewController,
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view.layer addSublayer:AnimateArcObject];
[AnimateArcObject animatingArc];
}
Apología de mala formato .... ¿Por favor alguien puede decirme qué estoy haciendo mal? También tengo dudas de que mi código pueda bloquearse en cualquier lugar después de acceder a esas dos funciones, ya que soy un novato en Core Animation y no tengo ni idea de que estoy en la buena dirección o no.
Cualquier ayuda será apreciada. Gracias.
Gracias por su respuesta.Pero establecer límites todavía no resolvió mi problema :( – NightFury
Me ayudó, pero no lo resolvió completamente. La capa ahora está dibujando en la pantalla, pero ligeramente desplazada de la vista/capa principal incluso cuando establecí los límites de la capa en el marco de vistas principal. Me falta algo fundamental, parece. – tracicot
@tracicot usted __must__ establece los límites de la capa al origen '(0, 0)'. Luego, use la propiedad del centro para cambiar la posición. También puede establecer el marco de capas directamente para controlar la posición. – Mazyod