Использование NSViewAnimation с NSAnimationEaseOut странное поведение - PullRequest
2 голосов
/ 02 января 2011

В одном из моих видов, которые можно перетащить, если пользователь уронит его в неподходящем месте, он просто вернется к исходному кадру, который был записан при нажатии мыши. Это работало нормально в течение нескольких дней без анимации, но я решил ввести анимацию:

-(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 голосов
/ 12 марта 2011

По какой-то причине вам нужно перевернуть начальный и конечный кадры, чтобы заставить NSAnimationEastOut работать. Кроме того, вам нужно установить делегат анимации, чтобы вы могли получать уведомления о завершении анимации, после чего вы должны вручную установить для кадра представления исходный конечный кадр.

...