Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 调整NSView中间动画的大小_Macos_Cocoa_Nsview_Appkit - Fatal编程技术网

Macos 调整NSView中间动画的大小

Macos 调整NSView中间动画的大小,macos,cocoa,nsview,appkit,Macos,Cocoa,Nsview,Appkit,我有一个普通的NSView,可以通过拖动窗口边缘来调整大小 如果在[NSView animator]动画期间调整了视图的大小,则视图将继续设置为原始动画的最终大小,但不考虑新窗口的大小 双击以开始动画,然后在完成之前调整窗口大小 使动画考虑新帧大小的最佳方法是什么?IMHO,最好的方法是在调整大小阶段开始时立即停止动画。 在调整大小阶段,用户可以控制并手动设置窗口的大小。 调整大小阶段结束时,窗口已设置为所需大小,因此无需执行更多操作。此类问题最好使用NSTimer而不是animator函数来解

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

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

双击以开始动画,然后在完成之前调整窗口大小


使动画考虑新帧大小的最佳方法是什么?

IMHO,最好的方法是在调整大小阶段开始时立即停止动画。 在调整大小阶段,用户可以控制并手动设置窗口的大小。
调整大小阶段结束时,窗口已设置为所需大小,因此无需执行更多操作。

此类问题最好使用NSTimer而不是animator函数来解决:

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

在每个循环中重复调用的函数将获取窗口的实际帧大小和视图的实际帧大小,并将两者差值的三分之一添加到视图的帧中,如:

frame.size.height += diffHeight/3.0;
因此,无论发生什么情况,视图都会越来越接近其目标。 一旦abs(差值)小于例如0.2,则直接将视图设置为所需大小并结束计时器。 这是直接的,只使用很少的代码,而且当它执行得很好时,您不需要监听任何事件。:-)

以下是初始化动画的关键代码(计时器必须是类的实例):

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

- (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];
}
-(void)resizeView:(id)userInfo;
{
BOOL status=[(NSNumber*)[userInfo userInfo]boolValue];
双星枝,stopwid;
NSRect newsiz=[[self window]frame];
stopwid=newSizBu立.size.width;
如果(状态){
stopwid-=100.0;
}
NSRect cbgRect=[自帧];
startwid=cbgRect.size.width;
double diff=stopwid startwid;
if(晶圆厂(差异)
- (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];
}