使用NSViewAnimation与NSAnimationEaseOut奇怪的行为

时间:2011-01-02 10:00:11

标签: objective-c cocoa macos nsviewanimation

在我可以拖动的一个视图中,如果用户将其放在不适当的位置,它只会回落到鼠标停止时记录的原始帧。这已经很好地工作了几天没有动画,但我决定介绍动画:

-(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的目的吗?

1 个答案:

答案 0 :(得分:0)

出于某种原因,您必须翻转开始帧和结束帧才能使NSAnimationEastOut正常工作。此外,您需要设置动画委托,以便在动画结束时通知您,然后您必须手动将视图的帧设置为原始结束帧。