【问题标题】:How to properly set the model when doing CABeginAnimation做CABeginAnimation时如何正确设置模型
【发布时间】:2016-02-13 06:14:51
【问题描述】:

我有一个UIImageView,当用户点击它时,4 点的边框会打开和关闭。我正在尝试按如下方式对边框进行动画处理:

CABasicAnimation *widthAnimation = [CABasicAnimation animationWithKeyPath:@"borderWidth"];
widthAnimation.toValue = self.isSelected ? @4.0 : @0.0;
widthAnimation.duration = 0.1;
[self.imageView.layer addAnimation:widthAnimation forKey:@"borderWidth"];

现在,正如我从研究和搜索中了解到的那样,CABasicAnimation 只是更改了表示层,而不是实际模型。我还读到使用fillModeremovedOnCompletion 是不好的做法,因为它会导致模型与用户看到的不一致。因此,我尝试使用以下行更改模型:

self.imageView.layer.borderWidth = self.isSelected ? 4.0 : 0.0;

问题是,这条线似乎直接设置了属性,所以当动画开始时,边框宽度已经达到了它的期望值。我试过在代码的开头、结尾和中间的任何地方都坚持这一行,但没有成功。我确实设法找到了一个 hacky 解决方案:我没有设置属性,而是将属性设置器传递给performSelector: withObject: afterDelay:,延迟是动画的持续时间。这在大多数情况下都有效,但有时循环不完全匹配,动画会先运行,然后跳回原始状态,然后捕捉到新状态,大概是 performSelector 的结果

那么有没有办法在没有performSelector 的情况下平滑地为边框设置动画?

非常感谢任何帮助。

【问题讨论】:

    标签: ios iphone animation calayer cabasicanimation


    【解决方案1】:

    这是我不久前制作的 CABasicAnimation 示例:

    -(void) animateProgressFrom:(CGFloat)fromValue to:(CGFloat)toValue
    {
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
        animation.fromValue = @(fromValue);
        animation.toValue = @(toValue);
        animation.duration = ABS(toValue - fromValue)*3.0;
        [self.layer addAnimation:animation forKey:@"opacity"];
    
        [CATransaction begin];
        [CATransaction setDisableActions:YES];
        self.layer.opacity = toValue;
        [CATransaction commit];
    }
    

    我认为您需要的是图层动画结束时的 CATransaction。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2023-01-12
      • 2017-06-25
      相关资源
      最近更新 更多