2012-10-23 76 views
5

我有一個正常的NSView即通過拖動窗口邊緣調整大小。調整大小的的NSView中期動畫

如果視圖是一個[動畫的NSView]動畫期間調整大小,它繼續動畫到原始動畫的最終尺寸,但並沒有考慮到新的窗口大小。

Here is a simple example project.雙擊開始動畫,然後調整窗口完成之前。

什麼是使新幀大小的動畫考慮的最佳方式?

回答

0

恕我直言,最好的辦法是儘快調整大小階段開始停止動畫。 在調整大小階段期間,用戶處於控制狀態並手動設置窗口大小。 當大小調整階段結束,該窗口已設置爲所需的大小,所以非必要做更多。

0

這類問題最好用一個NSTimer而不是動畫功能解決:

讓計時器調用的函數反覆,直到動畫「完成」。 一旦完成,結束計時器(無效)。

將在每個循環中重複調用的函數抓住窗口和視圖的實際框架尺寸的實際框架尺寸,只是增加了兩個差異的第三到視圖的框架,如:

frame.size.height += diffHeight/3.0; 

因此,無論發生什麼事情,視圖越來越接近其目的地。一旦絕對值(差值)小於等於0.2您直接將視圖設置爲所需的大小並結束計時器。 這是直接的,只使用很少的代碼,你不需要聽任何事件,而且表現相當好。 :-)

下面是initiallize動畫的關鍵代碼(定時器必須是你的類的實例):

if(timer)return; 
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(resizeView:) userInfo:[NSNumber numberWithBool:status] repeats:YES]; 
[timer setTolerance:0.02]; 

我用的是狀態,而不是你的話封閉,功能要反覆所謂的可能看起來有點像:

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