Мне нужно анимировать разные 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];
}
Показать, как вы объявляете и запускаете свои CATextLayers? – Unheilig
Также покажите, где и как вы вызываете этот метод. – Snowman
Проверьте, не является ли ваш текст параметром nil –