ios7 - hacer - grafico de barras para niños
Gráfico circular animado que puede animarse en ambas direcciones (1)
Intento crear un gráfico circular animado que pueda animar el pastel en ambas direcciones según aumente o disminuya el valor de su progress
. Empecé con el código de ejemplo proporcionado aquí e hice algunos ajustes como se sugiere aquí .
El problema es que la animación posterior todavía no está funcionando. Solo borra parcialmente el pastel. No estoy seguro de si esto se debe a que CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor);
animaciones incorrectamente o si CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor);
coordenadas de forma incorrecta, ya que si inserto CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor);
en la primera rama if
y cambie el modo de fusión a kCGBlendModeNormal
también allí el resultado es similar.
Así que aquí está mi código actual (extracto de PieLayer.m
), ¿quién puede sugerir mejoras?
- (void)drawInContext:(CGContextRef)context {
PieView *pieView = self.delegate;
NSAssert(pieView != nil, nil);
CGRect rect = CGRectInset(self.bounds, 1, 1);
CGFloat radius = MIN(CGRectGetMidX(rect), CGRectGetMidY(rect));
CGPoint center = CGPointMake(radius, CGRectGetMidY(rect));
CGContextSetFillColorWithColor(context, UIColor.clearColor.CGColor);
CGContextSetStrokeColorWithColor(context, pieView.circumferenceTintColor.CGColor);
CGContextSetLineWidth(context, 2.0f);
CGContextFillEllipseInRect(context, rect);
CGContextStrokeEllipseInRect(context, rect);
CGFloat startAngle = -M_PI / 2;
CGFloat endAngle = self.progress * 2 * M_PI + startAngle;
CGFloat lastEndAngle = self.lastProgress * 2 * M_PI + startAngle;
if (self.lastProgress > self.progress) {
NSLog(@"clear sector between progress=%f and lastProgress=%f", self.progress, self.lastProgress);
CGContextMoveToPoint(context, center.x, center.y);
CGContextAddArc(context, center.x, center.y, radius, endAngle, lastEndAngle, 0);
CGContextClosePath(context);
CGContextSetBlendMode(context, kCGBlendModeClear);
CGContextFillPath(context);
}
if (self.progress > 0) {
NSLog(@"draw sector to progress=%f (lastProgress=%f)", self.progress, self.lastProgress);
CGContextSetFillColorWithColor(context, pieView.sectorTintColor.CGColor);
CGContextMoveToPoint(context, center.x, center.y);
CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0);
CGContextClosePath(context);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextFillPath(context);
}
((PieLayer *)self.modelLayer).lastProgress = self.progress;
[super drawInContext:context];
}
El código en la respuesta que publicó ( pastel animado CAShapeLayer ) funciona bien en ambas direcciones, incluso con clearColor
: vea este video .
La única situación en la que clearColor
no produce un comportamiento correcto es cuando el color de fondo es sólido y el primer plano es claro: en ese caso, se requiere un cambio en el modo de fusión, como señaló en su código.
Intenté con estas tres configuraciones, y en todos los casos, la capa respondía correctamente a -setProgress:
-
DZRoundProgressView
como subvista de laUIView
principal; - Clase de vista principal configurada en
DZRoundProgressView
; -
DZRoundProgressView
como subcapa de laUIView
principal;
Además, es poco probable que el contenido de una capa en el fotograma anterior siga siendo visible en la próxima llamada al sorteo: aparentemente, el comportamiento predeterminado de -drawInContext:
es borrar el contexto antes de la ejecución, como dice esta pregunta .
Si no está trabajando con la propiedad de contents
de la capa, y no está pirateando la tubería de dibujo, puede haber algún problema con el valor de self.progress
; tal vez algún problema con la capa de presentación y la capa del modelo, o en la implementación de la propiedad.
De hecho, esto no resuelve su problema, ya que no pude reproducirlo o aislarlo, pero debería permitirle evitarlo.