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

DrawRect круг и размер и цвет

Я рисую круг в методе -drawRect: моего UIView, используя стандартный CGContextFillEllipseInRect() код. Тем не менее, я хотел бы слегка пульсировать (делать все больше и меньше) и изменять интенсивность заливки цвета анимацией. Например, если круг заполнен красным, я хотел бы пульсировать круг и сделать красное чуть светлее и темнее вовремя с пульсирующим действием. Не имея большого опыта в Core Animation, я немного потерялся о том, как это сделать, поэтому любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Это намного проще, если вы не нарисуете круг в drawRect:. Вместо этого настройте свое представление на использование CAShapeLayer, например:

@implementation PulseView

+ (Class)layerClass {
    return [CAShapeLayer class];
}

Система отправляет layoutSubviews к вашему представлению всякий раз, когда он меняет размер (в том числе, когда он впервые появляется). Мы переопределяем layoutSubviews для настройки формы и ее анимации:

- (void)layoutSubviews {
    [self setLayerProperties];
    [self attachAnimations];
}

Здесь мы устанавливаем путь слоя (который определяет его форму) и цвет заливки для формы:

- (void)setLayerProperties {
    CAShapeLayer *layer = (CAShapeLayer *)self.layer;
    layer.path = [UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
    layer.fillColor = [UIColor colorWithHue:0 saturation:1 brightness:.8 alpha:1].CGColor;
}

Нам нужно прикрепить две анимации к слою: один для пути и один для цвета заливки:

- (void)attachAnimations {
    [self attachPathAnimation];
    [self attachColorAnimation];
}

Здесь мы анимируем путь слоя:

- (void)attachPathAnimation {
    CABasicAnimation *animation = [self animationWithKeyPath:@"path"];
    animation.toValue = (__bridge id)[UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, 4, 4)].CGPath;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [self.layer addAnimation:animation forKey:animation.keyPath];
}

Здесь мы анимируем цвет заливки слоя:

- (void)attachColorAnimation {
    CABasicAnimation *animation = [self animationWithKeyPath:@"fillColor"];
    animation.fromValue = (__bridge id)[UIColor colorWithHue:0 saturation:.9 brightness:.9 alpha:1].CGColor;
    [self.layer addAnimation:animation forKey:animation.keyPath];
}

Оба метода attach*Animation используют вспомогательный метод, который создает базовую анимацию и устанавливает ее для повторения неопределенно с автореверсом и длительностью в одну секунду:

- (CABasicAnimation *)animationWithKeyPath:(NSString *)keyPath {
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath];
    animation.autoreverses = YES;
    animation.repeatCount = HUGE_VALF;
    animation.duration = 1;
    return animation;
}