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

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

Ответы на вопрос(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;
}
 Skoota31 мая 2012 г., 13:30
Потрясающее объяснение. Спасибо :)
 16 нояб. 2014 г., 23:09
Огромное спасибо большое!
 10 дек. 2012 г., 23:39
Это именно то, что я ищу, но как мне вызвать это из UIView, чтобы он появился? Я предполагаю, что этот код настроен в своем собственном классе.
 10 дек. 2012 г., 23:48
PulseView это подклассUIView.
 06 авг. 2015 г., 13:58
@ hasan83 проверить этоstackoverflow.com/questions/11515647/…

Ваш ответ на вопрос