2011-01-02 2 views
2

드래그 할 수있는 뷰 중 하나에서 사용자가 부적절한 장소에 떨어 뜨리면 마우스가 내려 갔을 때 기록 된 원래 프레임으로 떨어집니다. 이없이 애니메이션을 몇 일 동안 잘 작동하고있다,하지만 난 애니메이션을 도입하기로 결정했습니다 :이 NSAnimationLinear와 협력NSAnimationEaseOut 이상한 동작으로 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]; 
    } 
} 

을 기본 NSAnimationEaseInOut,하지만 실제로 원하는 것은 단순히 의미입니다 감속, NSAnimationEaseOut이해야한다고 가정합니다. 그러나 어떤 이유로 뷰를 사용하면 뷰가 끝날 프레임에 즉시 스냅 한 다음 커서가 놓은 곳 (시작 프레임)으로 슬라이딩하여 다시 끝내야 만합니다 (끝내야하는 대상). .

다른 모든 모드 (NSAnimationLinear, NSAnimationEaseIn, NSAnimationEaseInOut)는 정상적으로 작동하는 것 같습니다. NSAnimationEaseOut의 목적을 오해하고 있습니까?

답변

0

NSAnimationEastOut이 작동하려면 시작 프레임과 끝 프레임을 뒤집어 야합니다. 또한 애니메이션이 끝날 때 알림을받을 수 있도록 애니메이션 위임자를 설정해야합니다. 그런 다음보기의 프레임을 수동으로 원래의 끝 프레임으로 설정해야합니다.