2013-11-10 6 views
1

У меня есть класс CircleView : UIView, который анимирует (сжимается и растет), когда вы касаетесь его (через функцию pop). Я также хотел бы, чтобы поглаженный круг появлялся и вырастал (как основная водяная рябь), когда вы касаетесь его тоже. (Эффект, о котором я говорю, показан here in CSS)Отображение анимации двух фигур

Как мне это сделать?

Некоторые больше информации:

  • В идеале обе анимации будет управлять с одного CircleView класса
  • CircleView наследует от UIView

Update

На основе ответов у меня есть добавлен новый объект через 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]; 
} 
+0

Вы можете сделать много вещей внутри анимации блокировки, вы не ограничены только регулировки одного одно свойство. Если второй эффект, который вы желаете, вписывается во временные ограничения, просто создайте несколько операторов. В противном случае попробуйте вызывать несколько анимаций подряд, метод не ждет каждого блока завершения, он будет отключать их всех в последовательности, с задержкой в ​​миллисекундах. Для многих эффектов эта задержка полностью неотличима от одновременной. –

+0

Спасибо Райан, я знаю, что могу делать мультипольные вещи в блоке анимации, я полагаю, что реальный вопрос заключается в том, как добавить еще один «объект» для анимации? – Chris

+0

Обычно представление, которое вы называете анимацией, будет родителем многих подзонов, которые вы анимации. Ваш пример анимирует себя, но вы можете анимировать любое свойство любого объекта, на который вы ссылаетесь (при условии, что это анимационное свойство ...) –

ответ

0

Просто добавьте другие объекты, которые вы хотите анимировать к слою и установить их альфа-0.0. Затем вы можете играть с этим значением или непосредственно перед анимацией.

Я заметил, что вы не соблюдали соглашение об именах переменных с небольшим начальным. _color предпочтительнее _Color.

Кроме того, если вы хотите поместить слой в исходное состояние вы обычно используете определение матрицу преобразования:

self.transform = CGAffineTransformIdentity; 
+0

У меня все еще есть плохие методы именования, я стараюсь не забывать быть лучше. Как я могу добавить еще один элемент на слой и сохранить ссылку на него? Я также должен был бы оживить «поп», иначе я бы не хотел, чтобы я мог оживить «bezierPath», а не весь «UIView»? – Chris

+0

Вы можете добавить виды ('addSubview:') или слои ('addSublayer:'). Сохраните ссылку, объявив приватную переменную (выше в '@ implementation', между' {} '). – Mundi

+0

Я сделал это, но второй слой не анимирует, см. Мое обновление, спасибо :) – Chris

Смежные вопросы