调整NSView中间动画的大小

时间:2012-10-23 23:19:26

标签: macos cocoa nsview appkit

我有一个普通的NSView,可以通过拖动窗口边缘来调整大小。

如果在[NSView animator]动画期间调整视图大小,它会继续设置动画到原始动画的最终大小,但不会考虑新的窗口大小。

Here is a simple example project.双击开始动画,然后在窗口结束前调整窗口大小。

让动画考虑到新的帧尺寸的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

恕我直言,最好的方法是在调整大小阶段开始后立即停止动画。 在调整大小阶段,用户处于控制状态并手动设置窗口的大小。 调整大小阶段结束后,窗口已设置为所需大小,因此无需执行更多操作。

答案 1 :(得分:0)

使用NSTimer而不是动画函数可以最好地解决这类问题:

让计时器重复调用一个函数,直到动画“完成”。 完成后,结束计时器(无效)。

在每个循环中重复调用的函数会抓取窗口的实际框架大小和视图的实际框架大小,并简单地将两者的差异的三分之一添加到视图的框架中,如:

frame.size.height += diffHeight/3.0;

因此,无论发生什么,视图都会越来越近,越来越近。 一旦abs(差值)小于,例如0.2您将视图直接设置为所需的大小并结束计时器。 这是直接的,只使用很少的代码,你不需要听任何事件,而它表现得很好。 : - )

以下是初始化动画的关键代码(计时器必须是您班级的一个实例):

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

我使用单词status而不是你的单词关闭,重复调用的函数可能看起来有点像:

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