CABasicAnimation仅适用于在同一方法中创建的图层

时间:2013-12-11 16:25:53

标签: ios objective-c animation catextlayer

我需要根据某些条件为不同的CATextLayers设置动画。这就是为什么我编写了一个接受图层并为其设置动画的方法。这是:

- (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"];

“text”是CATextLayer创建,初始化并以其他方法添加到子图层。 问题是这段代码没有使“文本”图层生动。

(请注意,方法不要接受颜色。我暂时将红色和黑色用于测试。)

我开始测试了。如果我在此方法中创建一个图层,然后尝试为这个新创建的方法设置动画,它就可以了。 如果我将代码复制粘贴到创建所有图层的方法并尝试为其中一个创建动画 - 它也可以正常工作。

但是我需要在不同的时刻为不同的层设置动画,所以我认为这个功能是必不可少的。

请解释一下我做错了什么。 提前谢谢。

更新: 以下是如何创建图层并将其放置到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];
        }

1 个答案:

答案 0 :(得分: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"];       

}

但是说实话,我不明白为什么这条线确实有效。 我想如果不重置前景色,动画应该闪烁,前景色将返回其初始值。实际上,虽然屏幕上什么也没发生。 添加后,一切正常。