【问题标题】:How to stop CATransform3DMakeScale animating the scale change?如何停止 CATransform3DMakeScale 动画比例变化?
【发布时间】:2018-01-31 13:16:04
【问题描述】:

我在捏手势期间使用 CATransform3DMakeScale 调用来调整 CALayer 的大小,但每个转换调用都会从原始比例动画到目标比例。

由于我将捏合手势比例的值传递给变换调用,因此手势比例值的更新速度比导致卡顿的变换动画快。

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        pinchScale = [gestureRecognizer scale];
        CALayer *layer = [self layer];

        /* During pinching, this gets called again during the animation 
        of the last transformation */
        layer.transform = CATransform3DMakeScale(pinchScale, pinchScale, 0);
    }
}

如何阻止CATransform3DMakeScale 为转换设置动画?

【问题讨论】:

    标签: ios objective-c animation calayer scaletransform


    【解决方案1】:

    你需要禁用默认的CALayer动画机制添加这一行

    layer.actions = @{@"position": [NSNull null],@"frame":[NSNull null],@"bounds":[NSNull null]}; 
    

    下面这个CALayer *layer = [self layer];

    或者您可以使用它来获得相同的结果,这会更好,因为仅针对此更改禁用动画并在此之后启用动画,正如@Duncan 在他的评论中所说的那样

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    
    layer.transform = CATransform3DMakeScale(pinchScale, pinchScale, 0);
    [CATransaction commit];
    

    【讨论】:

    • 这是否会删除所有动画机制,包括通过 CABasicAnimation 添加动画?我需要保留 CABasicAnimation 功能。
    • 检查我更新的答案可能更适合您的问题@Shiri
    • 是的,使用 setDisableActions 是一种更好的方法。这样,您就可以关闭该更改的隐式动画,然后再将其重新打开。您最初的回答会阻止该图层框架上的所有隐式动画。
    • 你是对的@DuncanC 这就是为什么我添加了另一种方法来做到这一点,谢谢你的澄清
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多