2013-12-11 1 views
0

Мне нужно анимировать разные CATextLayers в зависимости от некоторых условий. Вот почему я написал метод, который принимает слой и оживляет его. Вот оно:CABasicAnimation работает только со слоями, созданными по тому же методу

- (void) animateText:(CATextLayer*) text withColor: (CGColorRef) color andDuration: (NSTimeInterval) duration 
{ 
    CABasicAnimation *colorAnimation = [CABasicAnimation 
             animationWithKeyPath:@"foregroundColor"]; 
    colorAnimation.duration = duration; 
    colorAnimation.fillMode = kCAFillModeForwards; 
    colorAnimation.removedOnCompletion = NO; 
    colorAnimation.fromValue = (id)[UIColor redColor].CGColor; 
    colorAnimation.toValue = (id)[UIColor blackColor].CGColor; 
    colorAnimation.timingFunction = [CAMediaTimingFunction 
            functionWithName:kCAMediaTimingFunctionLinear]; 
    [text addAnimation:colorAnimation 
        forKey:@"colorAnimation"]; 

«текст» является CATextLayer создан, инициализируются и добавляются к подслою в каком-либо другом методе. Проблема заключается в том, что этот код не создает анимированный слой «text».

(Пожалуйста, не обращайте внимание, что метод получает цвет. Я временно поставил красный и черный для тестирования.)

Я начал тестирование. Если я создам слой внутри этого метода, а затем попытаюсь анимировать этот вновь созданный метод, он работает нормально. Если я скопирую код в метод, в котором созданы все слои, и попытайтесь оживить один из них - он отлично работает.

Но мне нужно анимировать разные слои в разные моменты, поэтому я считаю эту функцию необходимой.

Пожалуйста, объясните мне, что я делаю неправильно. Спасибо заранее.

ОБНОВЛЕНО: Вот как слои созданы и размещены на UIView

//creating 110 text layers 

    CGFloat leftPoint = 0; 
    CGFloat topPoint = 0; 

    for (int i=0; i<11; ++i) 
    { 
     for (int j=0; j<10; ++j) 
     { 
      CATextLayer *label = [[CATextLayer alloc] init]; 
      [label setString:[_labels objectAtIndex:j+(i*10)]]; // _labels contains letters to display 
      [label setFrame:CGRectMake(leftPoint, topPoint, _labelWidth, _labelHeight)]; // _labelWidth and _labelHeight are valid numbers 
      [label setAlignmentMode:kCAAlignmentCenter]; 
      [label setForegroundColor:_textColor]; // _textColor is a CGColorRef type 
      [label setFont:(__bridge CFTypeRef)(_font.fontName)]; // font is UIFont type 
      [label setFontSize:[_font pointSize]]; 

      [_textViews addObject:label]; // saving to internal array variable 
      [[self layer] addSublayer:label]; 

      leftPoint += _labelWidth; 
     } 
     leftPoint = 0; 
     topPoint += _labelHeight; 
    } 

Если я помещаю код, как это в тот же метод, где я оживляющий, это работает. И он перестает работать, когда я прохожу слой в методе, как это:

for (int i = 0; i<labelsToHighlight.count; ++i) // labelsToHighlight is an array containing indexes of the CATextLayers which I need to animate 
     { 
      NSUInteger index = [[labelsToHighlight objectAtIndex:i] intValue]; 
      [self animateText:[_textViews objectAtIndex:index] withColor: _highlightedTextColor andDuration:_redrawAnimationDuration]; 
     } 
+0

Показать, как вы объявляете и запускаете свои CATextLayers? – Unheilig

+0

Также покажите, где и как вы вызываете этот метод. – Snowman

+0

Проверьте, не является ли ваш текст параметром nil –

ответ

0

Кажется, мне удалось заставить его работать:

Вот правильный метод:

- (void) animateText:(CATextLayer*) text fromColor: (CGColorRef) fromColor toColor: (CGColorRef) toColor andDuration: (NSTimeInterval) duration 
{ 
    CABasicAnimation *colorAnimation = [CABasicAnimation 
             animationWithKeyPath:@"foregroundColor"]; 
    colorAnimation.duration = duration; 
    colorAnimation.fillMode = kCAFillModeForwards; 
    colorAnimation.removedOnCompletion = NO; 
    colorAnimation.fromValue = (__bridge id)fromColor; 
    colorAnimation.toValue = (__bridge id) toColor; 
    colorAnimation.timingFunction = [CAMediaTimingFunction 
            functionWithName:kCAMediaTimingFunctionLinear]; 


    [text setForegroundColor:toColor]; // This is what I have actually added 
    [text addAnimation:colorAnimation forKey:@"colorAnimation"];  

} 

Но быть полностью честным, я не понимаю, почему эта линия действительно заработала. Я полагаю, что без сброса цвета переднего плана анимация должна была мигать, а цвет переднего плана возвращался к исходному значению. На самом деле, хотя на экране ничего не происходило. После этого все работает отлично.

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

  • Нет связанных вопросов^_^