2010-07-17 2 views
4

У меня есть пользовательская ячейка UITableView, у которой есть кнопка и ярлык. Я запускаю метод, когда кто-то нажимает на кнопку, а затем окрашивает эту строку. Все работает нормально.CABasicAnimation в CAGradientLayer не работает - что я делаю неправильно?

То, что я хочу на самом деле сделать это

  1. пользователь нажимает кнопку отводы, строка окрашивается в градиенте (он работает сейчас)
  2. Градиент угасает

Мой код ниже (BackView - это вид в моей пользовательской ячейке)

CAGradientLayer *layer = [CAGradientLayer layer]; 
layer.frame = BackView.bounds; 

UIColor *cOne  = [UIColor paleYellowColor]; 
UIColor *cTwo  = [UIColor whiteColor]; 

NSArray *colors = [NSArray arrayWithObjects:(id)cOne.CGColor, 
        cTwo.CGColor, nil]; 

layer.colors = colors; 

NSNumber *stopOne  = [NSNumber numberWithFloat:0.00]; 
NSNumber *stopTwo  = [NSNumber numberWithFloat:0.8]; 

NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil]; 
layer.locations = locations; 

CABasicAnimation *animateLayer = [CABasicAnimation animationWithKeyPath:@"colors"]; 
animateLayer.fromValue = [UIColor paleYellowColor]; 
animateLayer.toValue = [UIColor whiteColor]; 
animateLayer.duration = 3.0; 
animateLayer.removedOnCompletion = YES; 
animateLayer.fillMode = kCAFillModeBoth; 
animateLayer.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
[layer addAnimation:animateLayer forKey:@"animation"]; 

[BackView.layer insertSublayer:layer atIndex:0]; 

С помощью этого кода, когда я касаюсь кнопки на строке фон получает градиент, но он никогда не исчезает, нет анимации - ничего. Что я делаю не так? Я попробовал несколько перестановок и увидел несколько примеров, но никто из них не помог мне заставить эту работу работать.

Спасибо!

ответ

6

Когда вы анимируете свойство с явной анимацией, вы предоставляете тип, который ожидает свойство. Свойство colors является анимированным, однако вы даете ему UIColor для значений from и to. Он ожидает NSArray. Кроме того, вам нужны CGColorRefs для самих цветов. Я не пробовал, но я думаю, вы должны изменить свой и из линий:

animateLayer.fromValue = [NSArray arrayWithObjects: 
         (id)[[UIColor paleYellowColor] CGColor], 
         (id)[[UIColor whiteColor] CGColor], nil]; 

animateLayer.toValue = [NSArray arrayWithObjects: 
         (id)[[UIColor whiteColor] CGColor], 
         (id)[[UIColor whiteColor] CGColor], nil]; 

В теории, это должно исчезнуть из вашего желтого/белого градиента на белый/белый, который должен дать эффект выцветания.

С уважением.

+0

Мэтт, Да! Это была проблема, и ваш ответ разрешил мой вопрос. Я ударил еще одну загвоздку - теперь затухание работает красиво, но только один раз. Это строка в виде таблицы. Когда я нажимаю кнопку в ячейке, я вижу этот градиент/исчезает в первый раз. Все последующие краны запускают метод, в котором я создаю слой и т. Д., Но ничего не происходит визуально. Я подозреваю, что это что-то связано с слоем, но недостаточно знать. Я попробовал replaceSubLayer, но не мог заставить его работать, никаких подсказок? Я все равно буду пахать вперед, но спасибо за кучу ответа. – John

+0

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

+0

hmm..это имеет смысл. Сделаю - спасибо. – John

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