【问题标题】:secondary property update not sticking after animation动画后二级属性更新不粘
【发布时间】:2016-07-20 23:34:09
【问题描述】:

这里的 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;的“黑客”之外——实际上,添加这些并没有帮助!)。

确实在大约 3/30 秒后在同一图层上有另一个动画,使不透明度逐渐消失....但是将其推出或删除似乎并没有不同。

我知道如何为标准动画值执行此操作,但对于如何使用这样的辅助/评估值执行此操作,我缺少一些东西......


编辑添加:

一路上,添加animation.removedOnCompletion = NO;animation.fillMode = kCAFillModeForwards; 确实开始“工作”,但我不想泄露动画......

如果我为 percentScanned 添加一个 setter,它不会以 0 结尾调用,而是 display 以 0 结尾调用。很难追踪调用 setPercentScanned 和调用 display 之间的联系...

我可以破解我的display 来读取如下内容:

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

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

在 display 方法中设置断点是相当无用的(当然它只是在 display_if_needed 中发生)。 :/

【问题讨论】:

    标签: ios caanimation


    【解决方案1】:

    基本上,将最终值直接设置到图层上并仅对fromValue 进行动画处理。所以图层的值在动画结束时已经是正确的了。

    【讨论】:

    • 我相信这就是我在上面所做的。相同的模式适用于我的所有属性,除了这个是特殊的,因为它不是默认动画属性....
    • 但是动画正在运行,在设置的值上添加条件断点并检查它何时设置为零
    • 抱歉,如果我未能跟进;宝宝提前几周来了。
    • 调试中,貌似我只是在开始设置一次为0,然后在动画开始时设置为99,然后在动画中设置为0到99。
    • 如果我为 percentScanned 添加一个 setter,它永远不会用 0 调用,但 display 会在最后用 0 调用。很难追踪调用 setPercentScanned 和调用 display 之间的联系......
    【解决方案2】:

    percentScanned 需要设置为 @dynamic 变量,以便 Core Animation 为您实现访问器,每个 https://stackoverflow.com/a/2396461/856925

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 2023-04-08
      • 1970-01-01
      • 2014-03-25
      • 2013-08-30
      • 2017-11-04
      • 1970-01-01
      • 2015-06-24
      相关资源
      最近更新 更多