动画

时间:2016-07-20 23:34:09

标签: ios caanimation

REPRO存储库:https://github.com/kaolin/38492498/tree/master

我有@property int percentScanned

我设置了needsDisplayForKey:

+ (BOOL)needsDisplayForKey:(NSString *)key {
    if ([@"percentScanned" isEqualToString:key]) {
        return YES;
    }
    return [super needsDisplayForKey:key];
}

我的显示方法:

- (void)display {
    _percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]];
}

我的动画:

    [CATransaction begin];
    self.percentScanned = 99;
    _percentTextLayer.string=@"99%";
    [CATransaction setCompletionBlock:^{
        _percentTextLayer.string=@"99%";
        self.percentScanned = 99;
    }];
    {
        CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"percentScanned"];
        [a setFromValue:@0];
        [a setToValue:@99];
        [a setDuration:4.];
        [self addAnimation:a forKey:@"percentage"];
    }
    [CATransaction commit];

这一切都很好,除了在动画结束时,我的模型层字符串返回到" 00%"。正如你所看到的,我已经抛出了像厨房水槽那样强迫它停留在" 99%" (在animation.removedOnCompletion = NO;animation.fillMode = kCAFillModeForwards;之外的" hack" - 实际上,添加这些并没有帮助!)。

在同一层上有大约3/30秒后的另一个动画,淡化不透明度....但推出或删除它,似乎没有有所作为。

我知道如何为标准动画值执行此操作,但我错过了一些关于如何使用像这样的辅助/评估值执行此操作的内容....

编辑添加:

在此过程中的某个地方,添加animation.removedOnCompletion = NO;animation.fillMode = kCAFillModeForwards;确实已经开始了#34;正在工作"但我还是希望不会泄露动画....

如果我为percentScanned添加了一个setter,那么最后不会调用0,但最后会调用display 0。很难跟踪被调用的setPercentScanned和被调用的显示之间的链接...

我可以将我的display修改如下:

- (void)display {
    if ([[self presentationLayer] percentScanned] != 0) {
        _percentTextLayer.string = [NSString stringWithFormat:@"%02d%%",[[self presentationLayer] percentScanned]];
    }
}

然后它适用于我的特定用例,但这仍然不太理想......

在显示方法中放置一个断点是相当无益的(当然它只是在display_if_needed中发生)。 :/

2 个答案:

答案 0 :(得分:0)

基本上,将结束值直接设置到图层上,并仅为fromValue设置动画。因此,图层的值在动画结束时已经正确。

答案 1 :(得分:0)

percentScanned需要设置为@dynamic变量,以便Core Animation按https://stackoverflow.com/a/2396461/856925

为您实现访问者