2014-11-11 9 views
1

    // wc here is an NSWindowController 

    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:0.5f]; 

    if (duplication) { 
     NSPoint origin = initialSize.origin; 
     origin.y += initialSize.size.height; 
     origin = [wc.window cascadeTopLeftFromPoint:origin]; 
     origin.y -= initialSize.size.height; 
     //[[wc.window animator] setFrameOrigin:origin]; // Why setFrameOrigin and cascadeTopLeftFromPoint are not animated? 
     initialSize.origin = origin; 
     [[wc.window animator] setFrame:initialSize display:YES]; 
    } 

    // This block should be invoked when all of the animations started above have completed or been cancelled. 
    // For not to show the edit window till the duplication animation not finished 
    [NSAnimationContext currentContext].completionHandler = ^{ 
     if (edit) 
      [wc editDocument:self]; 
     else 
      if (fullScreen) 
       [wc.window toggleFullScreen:self]; 
    }; 

    [NSAnimationContext endGrouping]; 

В этом случае выполняется завершающий блок, но, к сожалению, он не ждет завершения перестановки окна, вместо этого он немедленно открывает лист редактирования окна и перемещает их вместе.Почему NSAnimationContext completeHandler не работает (иногда)?

Самое странное, что несколько строк выше в том же исходного файла и тот же тип блока сдачи прекрасно работает: -O

Что я здесь отсутствует?

ответ

0

ОК, это ошибка, и я нахожу файл отчета об ошибке. Следующая версия отлично работает

__block NSRect newPosition(initialSize); 
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ 
    [context setDuration:0.5f]; 

    if (duplication) { 
     NSPoint origin = newPosition.origin; 
     origin.y += newPosition.size.height; 
     origin = [wc.window cascadeTopLeftFromPoint:origin]; 
     origin.y -= newPosition.size.height; 
     //[[wc.window animator] setFrameOrigin:origin]; // Why setFrameOrigin and cascadeTopLeftFromPoint are not animated? 
     newPosition.origin = origin; 
     [[wc.window animator] setFrame:newPosition display:YES]; 
    } 
} completionHandler:^{ 
    // This block will be invoked when all of the animations 
    // started above have completed or been cancelled. 
    if (edit) 
     [wc editDocument:self]; 
    else 
     if (fullScreen) 
      [wc.window toggleFullScreen:self]; 
}]; 
3

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