Показать анимацию двух фигур
У меня есть CircleView : UIView
класс, который оживляет (сжимается и растет), когда вы касаетесь его (через pop
функция). Я также хотел бы, чтобы при прикосновении к нему появлялся и рос круг (например, водная рябь). (Эффект, о котором я говорю, показан здесь в CSS)
Как мне это сделать?
Еще немного информации:
- В идеале обе анимации будут управляемы с одного
CircleView
учебный класс CircleView
наследуетсяUIView
Обновить
Основываясь на ответах, я добавил новый объект через subLayer
, Это показывает нормально, но это не оживляет во время pop
, Может кто-нибудь помочь мне понять, почему?
Вот мой текущий код (все равно соответствующие биты)
- (void)layoutSubviews
{
[self setLayerProperties];
}
- (void)setLayerProperties {
//The view’s Core Animation layer used for rendering.
CAShapeLayer *layer = (CAShapeLayer *)self.layer;
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)
byRoundingCorners:UIRectCornerAllCorners
cornerRadii:self.frame.size];
layer.path = bezierPath.CGPath;
layer.fillColor = _Color.CGColor;
rippleLayer = [[CALayer alloc] init];
layer.path = bezierPath.CGPath;
layer.strokeColor = [UIColor blueColor].CGColor;
[layer addSublayer:rippleLayer];
}
// Does the animated "pop"
- (void)pop{
CABasicAnimation *animation = [self animationWithKeyPath:@"transform.scale"];
[animation setFromValue:[NSNumber numberWithFloat:1.0f]];
[animation setToValue:[NSNumber numberWithFloat:0.8f]];
[animation setRemovedOnCompletion:YES];
[animation setDuration:0.15];
[animation setAutoreverses:YES];
[self.layer addAnimation:animation forKey:animation.keyPath];
rippleLayer.anchorPoint = CGPointMake(1, 1);
CABasicAnimation *scale = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[scale setFromValue:[NSNumber numberWithFloat:1.0f]];
[scale setToValue:[NSNumber numberWithFloat:2.0f]];
[scale setRepeatCount:1];
[scale setDuration:1.0f];
//r[scale setRemovedOnCompletion:YES];
[scale setFillMode:kCAFillModeForwards];
[rippleLayer addAnimation:scale forKey:scale.keyPath];
}
1 ответ
Просто добавьте другие объекты, которые вы хотите анимировать на свой слой и установите их альфа на 0.0. Затем вы можете играть с этим значением в или непосредственно перед вашей анимацией.
Я заметил, что вы не следовали соглашению об именовании переменных с небольшим начальным значением. _color
было бы предпочтительнее _Color
,
Кроме того, если вы хотите перевести слой в исходное состояние, вы обычно используете матрицу идентифицирующего преобразования:
self.transform = CGAffineTransformIdentity;