Подтвердить что ты не робот

Применить градиентный цвет к дуге, созданной с помощью UIBezierPath

Я хочу создать индикатор выполнения, который имеет форму дуги. Цвет индикатора выполнения должен измениться в соответствии со значениями.

Я создал дугу, используя UIBezierPath bezierPathWithArcCenter. Я использовал следующий код:

- (void)viewDidLoad
{
    [super viewDidLoad];

    int radius = 100;

    CAShapeLayer *arc = [CAShapeLayer layer];

    arc.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 50) radius:radius startAngle:60.0 endAngle:0.0 clockwise:YES].CGPath;

    arc.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius,
                                  CGRectGetMidY(self.view.frame)-radius);

    arc.fillColor = [UIColor clearColor].CGColor;
    arc.strokeColor = [UIColor purpleColor].CGColor;
    arc.lineWidth = 15;

    [self.view.layer addSublayer:arc];

    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    drawAnimation.duration            = 5.0; // "animate over 10 seconds or so.."
    drawAnimation.repeatCount         = 1.0;  // Animate only once..
    drawAnimation.removedOnCompletion = NO;   // Remain stroked after the animation..
    drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
    drawAnimation.toValue   = [NSNumber numberWithFloat:10.0f];
    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [arc addAnimation:drawAnimation forKey:@"drawCircleAnimation"];

}

Результат выглядит следующим образом:

enter image description here

Мой вопрос: как применить градиент к цвету, если значение равно <= 50%? Я также создал UIButton, который генерирует случайные числа CGFloat, чтобы связать его с индикатором выполнения. Кто-нибудь есть идея, как справиться с этим?

Градиент будет выглядеть примерно так:

enter image description here

Любая помощь будет оценена!

Большое спасибо.

Гранит

4b9b3361

Ответ 1

Вы можете использовать CAGradientLayer для получения эффекта градиента и использовать CAShapeLayer в качестве маски.

например:.

- (void)viewDidLoad
{
    [super viewDidLoad];

    int radius = 100;

    CAShapeLayer *arc = [CAShapeLayer layer];    
    arc.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 50) radius:radius startAngle:60.0 endAngle:0.0 clockwise:YES].CGPath;

    arc.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius,
                               CGRectGetMidY(self.view.frame)-radius);

    arc.fillColor = [UIColor clearColor].CGColor;
    arc.strokeColor = [UIColor purpleColor].CGColor;
    arc.lineWidth = 15; 
    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    drawAnimation.duration            = 5.0; // "animate over 10 seconds or so.."
    drawAnimation.repeatCount         = 1.0;  // Animate only once..
    drawAnimation.removedOnCompletion = NO;   // Remain stroked after the animation..
    drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
    drawAnimation.toValue   = [NSNumber numberWithFloat:10.0f];
    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [arc addAnimation:drawAnimation forKey:@"drawCircleAnimation"];

    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = self.view.frame;
    gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor blueColor].CGColor ];
    gradientLayer.startPoint = CGPointMake(0,0.5);
    gradientLayer.endPoint = CGPointMake(1,0.5);

    [self.view.layer addSublayer:gradientLayer];
     //Using arc as a mask instead of adding it as a sublayer.
     //[self.view.layer addSublayer:arc]; 
     gradientLayer.mask = arc;


}

Ответ 2

введите описание изображения здесь

Чтобы нарисовать градиент вдоль штриха, см. эту реализацию: fooobar.com/info/228050/...

EDIT: Короче говоря, создайте пользовательский класс UIView, добавьте к нему радиальный градиент, итерации между двумя цветами под увеличивающимися углами, например. colour1 = 1 градус, colour2 = 2 градуса и т.д., вплоть до 360. Затем примените маску пончика. Когда вы изменяете значение strokeEnd маскирующего CAShapeLayer, вы также вращаете базовый радиальный градиент. Поскольку они движутся вместе, похоже, что сам удар имеет градиент.