2

ドラッグできる私のビューの1つでは、ユーザーが不適切な場所にドロップすると、マウスが下がったときに記録された元のフレームに戻るだけです。これはアニメーションなしで数日間正常に機能していますが、アニメーションを導入することにしました。

-(void)dropToFrameOrigin:(NSPoint)newFrameOrigin animated:(BOOL)animated {
    if (animated) {
        NSRect newFrameRect = [self frame];
        newFrameRect.origin = newFrameOrigin;

        NSDictionary *animationInfo = [NSDictionary dictionaryWithObjectsAndKeys:self, NSViewAnimationTargetKey,
                                       [NSValue valueWithRect:[self frame]], NSViewAnimationStartFrameKey,
                                       [NSValue valueWithRect:newFrameRect], NSViewAnimationEndFrameKey,
                                        nil];
        NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:animationInfo]];
        [animation setDuration:0.2];
        [animation setAnimationCurve:NSAnimationLinear];
        [animation startAnimation];
        [animation release];
    } else {
        [self setFrameOrigin:newFrameOrigin];
    }
}

これはNSAnimationLinearとデフォルトのNSAnimationEaseInOutで機能しますが、実際に必要なのは、NSAnimationEaseOutが実行するはずの減速感だけです。何らかの理由で、これを使用すると、ビューは終了するフレームにすぐにスナップし、カーソルがドロップした場所(開始フレーム)にスライドして戻り、終了フレーム(あるべき姿)にスナップバックします。 。

他のすべてのモード(NSAnimationLinear、NSAnimationEaseIn、NSAnimationEaseInOut)は問題なく機能しているようです。NSAnimationEaseOutの目的を誤解していますか?

4

1 に答える 1

0

何らかの理由で、NSAnimationEastOutを機能させるには、開始フレームと終了フレームを反転する必要があります。さらに、アニメーションが終了したときに通知を受け取ることができるように、アニメーションデリゲートを設定する必要があります。その後、ビューのフレームを元の終了フレームに手動で設定する必要があります。

于 2011-03-12T04:29:41.837 に答える