2014-12-12 2 views
0

У меня есть иерархия пользовательских UIView объектов. Вид листа можно выбрать. У них есть собственность isSelected. Если для этого параметра установлено значение YES, эффект, который я хочу, - это изменить вид на мой «выбранный» цвет сразу, а затем временно набухать в размере, а затем вернуться к его первоначальному размеру. Я думал следующий код будет делать трюк:Как оживить изменение цвета и цвета для пользовательского выбора?

self.backgroundColor = [UIColor colorWithRed: 0 green: 0.5 blue: 1 alpha: 1]; 
CGRect currentFrame = self.frame; 
CGRect bigFrame = CGRectInset(currentFrame, -50, -50); 
[UIView animateWithDuration: 0.4 animations:^{ 
    self.frame = bigFrame; 
} completion:^(BOOL finished) { 
    if (finished) { 
     [UIView animateWithDuration: 0.4 animations:^{ 
      self.frame = currentFrame; 
     }]; 
    } 
}]; 

я преувеличил время и смещение здесь, потому что я пытался увидеть, что на самом деле происходит. Что происходит, так это то, что изменения цвета кажутся анимированными, поэтому он медленно изменяется от белизны по умолчанию от 0,93 до моего синего. Кроме того, он не растет в размерах. Похоже, что он переводится вниз и направо по вставке, а затем возвращается в нормальное место (а не растет во всех направлениях).

Что мне не хватает?

ответ

1

Использование ключевых кадров анимации:

CAKeyframeAnimation *bounceAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; 
// 200 is example side of the big view, but you can apply any formula to it. For example relative to superview, or screen bounds 
CGFloat multiplier = 200/MAX(self.frame.size.height, self.frame.size.width) 
bounceAnimation.values = 
@[@(1 - 0.1 * multiplier, 
    @(1 + 0.3 * multiplier), 
    @(1 + 0.1 * multiplier, 
    @1.0]; 
bounceAnimation.duration = 0.25; 
bounceAnimation.removedOnCompletion = YES; 
bounceAnimation.fillMode = kCAFillModeForwards; 
[self.layer addAnimation:bounceAnimation forKey:@"bounceAnimation"]; 
+0

Я никогда раньше не использовал их вариант ключевого кадра. Благодаря! Это в основном работало. По крайней мере, он не вел себя неожиданно. Теперь у меня есть два вопроса. 1) Использование преобразования делает временное увеличение размера относительно исходного размера. Это заставляет маленьких парней просто поп-музыки, а большие парни действительно большие. Я предпочел бы иметь однородный пиксель «начало» кадра. Есть ли альтернативный способ? Я мог бы перевести вычисления весов для достижения желаемого смещения пикселей, я думаю. 2) Я не могу найти документы для 'CATransform3D'. Я нашел функции для их изменения. Но не знаю, куда пойти, чтобы найти .scale –

+0

Чтобы сделать кадры, я переключился на 'bounds' keyPath (видимо, вы не должны анимации кадров слоев, а скорее границ и положения и т. Д.). А затем построил массив 'NSValue' вокруг' CGRect'. –

+0

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

0

Как насчет простой CGAffineTransformMakeScale? Как и ...

[UIView animateWithDuration: 0.4 animations:^{ 
    // Update 1.3 to what ever works for you 
    self.transform = CGAffineTransformMakeScale(1.3, 1.3); 
} completion:^(BOOL finished) { 
    if (finished) { 
     [UIView animateWithDuration: 0.4 animations:^{ 
      self.transform = CGAffineTransformMakeScale(1.0, 1.0); 
     }]; 
    } 
}]; 

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/#//apple_ref/c/func/CGAffineTransformMakeScale

+0

Хммм ... Производит другой результат. Если я замедляю анимацию вниз (1 с) и использую шкалу в 2, то она делает внезапно до половины размера и медленно приближается к нормальному, а затем через 1 сек она внезапно становится 2x большой, а затем медленно (для остальных 1 сек) возвращается к исходному размеру. –

+0

В этом представлении этого представления это видется в его 'layoutSubviews'. Это как-то связано с анимацией? –