2012-10-23 8 views
5

Mam normalny NSView, który można zmienić, przeciągając krawędzie okna.Zmiana rozmiaru mid-animacji NSView

Jeśli rozmiar zostanie zmieniony podczas animacji [animator NSView], animacja będzie kontynuowana do ostatecznego rozmiaru oryginalnej animacji, ale nie uwzględnia nowego rozmiaru okna.

Here is a simple example project. Kliknij dwukrotnie, aby rozpocząć animację, a następnie zmień rozmiar okna przed jego zakończeniem.

Jaki jest najlepszy sposób, aby animacja uwzględniała nowy rozmiar klatki?

Odpowiedz

0

IMHO, najlepiej będzie zatrzymać animację, gdy tylko rozpocznie się zmiana rozmiaru. Podczas fazy zmiany użytkownik kontroluje i ręcznie ustawia rozmiar okna. Po zakończeniu fazy zmiany rozmiaru, okno jest już ustawione na pożądany rozmiar, więc nie ma potrzeby robienia więcej.

0

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]; 
}