J'essaie de dessiner un cercle à l'aide de la méthode UIBezierPath addArcWithCenter:
UIBezierPath *bezierPath =
[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0., 0., 100., 100.)];
[bezierPath addArcWithCenter:center
radius:0.
startAngle:0 endAngle:2 * M_PI clockwise:YES];
CAShapeLayer *progressLayer = [[CAShapeLayer alloc] init];
[progressLayer setPath:bezierPath.CGPath];
[progressLayer setStrokeColor:[UIColor colorWithWhite:1. alpha:.2].CGColor];
[progressLayer setFillColor:[UIColor clearColor].CGColor];
[progressLayer setLineWidth:.3 * self.bounds.size.width];
[progressLayer setStrokeStart:_volumeValue/100.];
[progressLayer setStrokeEnd:volume/100.]; // between 0 and 100
[_circleView.layer addSublayer:progressLayer];
mais ce que je reçois est le suivant:
J'ai essayé de jouer avec les différents paramètres mais pas de chance
Je vous remercie
METTRE À JOUR :
Je suis désolé si je n'ai pas expliqué ce que j'essaie de faire:
* Le cercle de fond est dessiné avec:
[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0., 0., 100., 100.)]
* J'essaie de dessiner le cercle rouge pas à pas en utilisant bezierPathWithOvalInRect Entre 2 valeurs: _volumeValue et volume
Mais je ne peux pas obtenir un cercle parfait, mais la partie horizontale après une certaine valeur.
OK, essayez ceci ...
UIBezierPath *bezierPath = [UIBezierPath bezierPath];
[bezierPath addArcWithCenter:center radius:50 startAngle:0 endAngle:2 * M_PI clockwise:YES];
CAShapeLayer *progressLayer = [[CAShapeLayer alloc] init];
[progressLayer setPath:bezierPath.CGPath];
[progressLayer setStrokeColor:[UIColor colorWithWhite:1.0 alpha:0.2].CGColor];
[progressLayer setFillColor:[UIColor clearColor].CGColor];
[progressLayer setLineWidth:0.3 * self.bounds.size.width];
[progressLayer setStrokeEnd:volume/100];
[_circleView.layer addSublayer:progressLayer];
volume
devrait être compris entre 0 et 100.
En outre, vous créiez un chemin avec une ellipse et y ajoutiez un arc. Ne fais pas ça. Il suffit d’ajouter l’arc au chemin vide.
Si vous voulez changer le point de départ de l'arc, changez startAngle
et endAngle
lors de l'ajout de l'arc. Ne changez pas la valeur de départ du trait.
Animation du changement
[CATransaction begin];
CABasicAnimation *animateStrokeDown = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
animateStrokeDown.toValue = [NSNumber numberWithFloat:volume/100.];
[progressLayer addAnimation:animateStrokeDown forKey:@"animateStrokeDown"];
[CATransaction commit];
OK, cela va animer la propriété strokeEnd
du chemin. Vous devez comprendre que ça marche comme ça ...
Begin state: start = 0, end = 6
0123456
-------
// increase volume
Animate to: end = 9
0123456789
----------
// decrease volume
Animate to: end = 1
01
--
Le début n'a pas bougé. La fin a bougé. Vous ne "complétez" pas le reste de la ligne. Vous changez la ligne.
C’est pourquoi le début doit toujours être 0 et que vous changez simplement la fin du trait.
Je n'ai aucune idée de ce à quoi vous vous attendez ni de ce qui ne va pas avec votre résultat réel, mais un rayon de 0 dans votre deuxième ligne de code semble louche. Il ajoute simplement un point sur center
au chemin actuel (qui inclut déjà un cercle).
startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES
(La raison en est que le système de coordonnées par défaut sur iOS a un axe x dirigé vers la droite et un axe y dirigé vers le bas.)
lisez ce document https://developer.Apple.com/library/ios/documentation/uikit/reference/UIBezierPath_class/index.html
spécifier un angle de départ de 0 radian, un angle de fin de π et définir le paramètre horaire dans le sens des aiguilles d'une montre sur YES dessine la moitié inférieure du cercle. Cependant, spécifier les mêmes angles de début et de fin, mais définir le paramètre de réglage des aiguilles d'une montre sur NO dessine la moitié supérieure du cercle.