1

レイヤーの位置と変換 (回転) のアニメーション化に成功しました。

ここで、アンカーポイントをアニメーション化する必要がありましたが、すべての試みに失敗しました! 私がこれを行うときでも:

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 軸で左に移動しすぎて、戻ってきて、繰り返します (自動反転がオンになっているため)。

レイヤーの階層について注意してください。SuperLayer には、アニメーションを適用する 3 つのサブレイヤーがあります。

なんで?アンカー ポイントをどのようにアニメーション化する必要がありますか?

私のコード:

    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 値のアニメーションは、ココアとココア タッチの両方でまったく同じである必要があります。

4

1 に答える 1

2

あなたはこれを信じるつもりはありません(あたかも私が最初からあなたと一緒に座っているかのように)..

を設定しなくても、位置と回転のアニメーションが正常に機能していましたfromValue。ただし、アンカー ポイントをアニメーション化するには、アンカー ポイントfromValueを初期値に設定する必要がありました。

animation.fromValue = [subLayer valueForKeyPath:keyPath];
于 2012-05-09T07:01:41.090 に答える