动画 CALayer 锚点



我已经成功地对图层的位置和变换(旋转)进行了动画处理。

现在,我需要对锚点进行动画处理,但所有尝试都失败了!即使我这样做:

2012... App[6437:403] layer: 1, KeyPath: anchorPoint, fromValue: NSPoint: {1.05, 0.5}, toValue: NSPoint: {1.05, 0.5}, Duration: 2.5

这是在对图层进行动画处理之前卡住的 NSLog。我得到的结果是图层在 X 轴中向左移动太远,然后返回..并重复(因为自动反转为 ON)。

关于图层层次结构的注意事项:超级图层有三个子图层,我正在应用动画。

为什么?锚点应该如何动画化?

我的代码:

    NSArray* subKeyPath     = [keyPaths objectAtIndex:tag];
    NSArray* subToValue     = [toValues objectAtIndex:tag];
    NSArray* subDuration    = [durations objectAtIndex:tag];
    NSEnumerator* keyPathsEnum  = [subKeyPath objectEnumerator];
    NSEnumerator* toValuesEnum  = [subToValue objectEnumerator];
    NSEnumerator* durationsEnum = [subDuration objectEnumerator];
    NSString* keyPath;
    NSNumber* toValue;
    NSNumber* duration;
    while ((keyPath = [keyPathsEnum nextObject]) && (toValue = [toValuesEnum nextObject]) && (duration = [durationsEnum nextObject])) {
        CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:keyPath];
        id offsetToValue;
        if ([keyPath hasPrefix:@"position"]) {
        //I removed the position animation, since animating the anchorPoint should suffice
        } else if ([keyPath hasPrefix:@"anchorPoint"]) {
            //This was when I used anchorPoint.x float value         = [[subLayer valueForKeyPath:keyPath] floatValue] - ([toValue floatValue]/[[subLayer contents] size].width);
            offsetToValue       = [NSNumber valueWithPoint:CGPointMake(1.05, 0.5)];
            keyPath             = [keyPath substringToIndex:[keyPath length]-2];
        } else {
            offsetToValue       = toValue;
        }
...
        animation.toValue       = offsetToValue;
        animation.duration      = [duration floatValue];
        animation.fillMode      = kCAFillModeForwards;
        animation.repeatCount   = INFINITY;
        animation.autoreverses  = YES;
        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        [subLayer addAnimation:animation forKey:keyPath];
        //update the model
    }

我尝试对"anchorPoint.x"键路径进行动画处理,结果相同:(

最后一点,我正在编写一个可可应用程序,但是在可可和可可触摸上对 X 值进行动画处理应该完全相同。

你不会相信这一点(好像我从一开始就和你坐在一起)。

在没有设置fromValue的情况下,对位置和旋转进行动画处理正常工作。但是,对锚点进行动画处理需要我将锚点fromValue设置为初始值!

animation.fromValue = [subLayer valueForKeyPath:keyPath];

最新更新