Tego rodzaju problem jest najlepiej rozwiązane z NSTimer zamiast funkcji animatora:
Niech wywołanie timera funkcją wielokrotnie, aż animacja jest „kompletna”. Po zakończeniu zakończ timer (unieważnij).
Funkcja być wielokrotnie nazywany w każdej pętli chwyta rzeczywistą framesize okna i rzeczywistą framesize swojego widoku i po prostu dodaje trzecią różnicy dwóch do ramki widoku, jak:
frame.size.height += diffHeight/3.0;
Tak więc, niezależnie od tego, co się stanie, widok powiększa się lub kurczy coraz bliżej celu podróży. Po abs (różnica) jest mniejsza niż np. 0.2 ustawić widok bezpośrednio na żądany rozmiar i zakończyć licznik czasu. To jest bezpośrednie, wykorzystuje tylko mały kod i nie musisz słuchać żadnych zdarzeń, gdy działa całkiem nieźle. :-)
Oto najważniejsze kody do initiallize animację (timer musi być instancją klasy):
if(timer)return;
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(resizeView:) userInfo:[NSNumber numberWithBool:status] repeats:YES];
[timer setTolerance:0.02];
używam statusu słowo zamiast twoje słowo zamknięty, funkcja się wielokrotnie nazwany może wyglądać nieco jak:
- (void)resizeView:(id)userInfo;
{
BOOL status = [(NSNumber *)[userInfo userInfo] boolValue];
double startwid,stopwid;
NSRect newSizeRect = [[self window] frame];
stopwid = newSizeRect.size.width;
if(status){
stopwid -= 100.0;
}
NSRect cbgRect = [self frame];
startwid = cbgRect.size.width;
double diff = stopwid-startwid;
if(fabs(diff)<0.2){
diff = 0;
startwid = stopwid;
[timer invalidate];
timer = nil;
//NSLog(@"stop");
}
//NSLog(@"%f - %f = %f /10 = %f",stopwid,startwid,diff,diff/3.0);
cbgRect.size.width = startwid+diff/3.0;
[self setFrame:cbgRect];
}