2

OS X 10.6 でアニメーション コードを書きましたが、10.9 用にアプリを再コンパイルすると、アニメーションが正しく動作しません。

ボタンの配列があります。それぞれの目標は、ボタンを縮小してから通常のサイズに戻し、次に縮小してから通常のサイズに戻すことです(数回「曲げる」ため)。

NSMutableArray *animations = [NSMutableArray arrayWithCapacity:buttons.count];

NSMutableArray *allAnimations = [NSMutableArray arrayWithCapacity:buttons.count*4];

for(NSButton *button in buttons) {
    // store the original frame and generate the smaller frame
    NSRect originalFrame = button.frame;
    NSRect smallFrame = [self smallRectForRect:originalFrame scale:0.9];

    // build dictionaries which describe the animations from normal-to-small and vice versa
    NSMutableDictionary *normalToSmall = [NSMutableDictionary dictionary];
    [normalToSmall setObject:button forKey:NSViewAnimationTargetKey];
    [normalToSmall setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationStartFrameKey];
    [normalToSmall setObject:[NSValue valueWithRect:smallFrame] forKey:NSViewAnimationEndFrameKey];

    NSMutableDictionary *smallToNormal = [NSMutableDictionary dictionary];
    [smallToNormal setObject:button forKey:NSViewAnimationTargetKey];
    [smallToNormal setObject:[NSValue valueWithRect:smallFrame] forKey:NSViewAnimationStartFrameKey];
    [smallToNormal setObject:[NSValue valueWithRect:originalFrame] forKey:NSViewAnimationEndFrameKey];

    // create, and chain together, the shrink, reset, shrink, reset animation chain
    NSViewAnimation *animation1 = [self createAnimationWithDictionary:normalToSmall duration:duration startingAfterAnimation:nil];
    NSViewAnimation *animation2 = [self createAnimationWithDictionary:smallToNormal duration:duration startingAfterAnimation:animation1];
    NSViewAnimation *animation3 = [self createAnimationWithDictionary:normalToSmall duration:duration startingAfterAnimation:animation2];
    NSViewAnimation *animation4 = [self createAnimationWithDictionary:smallToNormal duration:duration startingAfterAnimation:animation3];

    // store all of the animations in an array just in case ARC wants to release them prematurely.
    [allAnimations addObjectsFromArray:@[animation1, animation2, animation3, animation4]];

    // Store the first animation, so that we can start each of the chains after we're done creating them.
    [animations addObject:animation1];
}

// start the first animation in each chain
for (NSViewAnimation *animation in animations) {    
    [animation startAnimation];
}

各アニメーションを作成するために使用した関数は次のとおりです。

- (NSViewAnimation*) createAnimationWithDictionary:(NSDictionary*)animationDictionary duration:(float)duration startingAfterAnimation:(NSViewAnimation*)previousAnimation {
    NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:animationDictionary]];
    [animation setDuration:duration];
    [animation setDelegate:self];

    if (previousAnimation != nil) {
        [animation startWhenAnimation:previousAnimation reachesProgress:1.0];
    }
    return animation;
}

アニメーションの開始と終了を確認できるように、ウィンドウ コントローラーをデリゲートとして設定しました。各チェーンの最初のアニメーションのみが開始および終了するように見えます。-startWhenAnimation:reachesProgress:1.0まったく開始されないように構成された後続のアニメーション。

後続のアニメーションが実行されないのはなぜですか?

4

0 に答える 0