Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Objective c 以编程方式调整NSView的大小_Objective C_Cocoa_Resize_Nsview_Cgrect - Fatal编程技术网

Objective c 以编程方式调整NSView的大小

Objective c 以编程方式调整NSView的大小,objective-c,cocoa,resize,nsview,cgrect,Objective C,Cocoa,Resize,Nsview,Cgrect,我有一个主视图,应该显示几个子视图。这些子视图直接位于彼此的上方和下方(在z轴上),并将使用以下代码向下(在y轴上)和向上移动: if (!CGRectIsNull(rectIntersection)) { CGRect newFrame = CGRectOffset (rectIntersection, 0, -2); [backgroundView setFrame:newFrame]; } else{ [viewsUpdater invalidate]; v

我有一个主视图,应该显示几个子视图。这些子视图直接位于彼此的上方和下方(在z轴上),并将使用以下代码向下(在y轴上)和向上移动:

if (!CGRectIsNull(rectIntersection)) {
    CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
    [backgroundView setFrame:newFrame];
} else{
    [viewsUpdater invalidate];
    viewsUpdater = nil;
}
rectIntersection用于告知视图何时已完全向下移动且不再位于前视图的后面(当它们不再重叠时),rectIntersection为null时,它一次向下移动2个像素,因为这都在重复计时器内。我希望我的主视图(包含这两个其他视图的主视图)向下调整大小,以便在背景中的视图被降低时展开。这是我正在尝试的代码:

CGRect mainViewFrame = [mainView frame];
if (!CGRectContainsRect(mainViewFrame, backgroundFrame)) {
    CGRect newMainViewFrame = CGRectMake(0,
                                         0,
                                         mainViewFrame.size.width,
                                         (mainViewFrame.size.height + 2));
    [mainView setFrame:newMainViewFrame];
}
其目的是检查主视图是否包含此背景视图。当背景视图降低时,主视图不再包含它,它(应该)向下扩展2个像素。直到背景视图停止移动,并且主视图最终包含backgroundView,这种情况才会发生

问题是mainView根本没有调整大小。背景视图正在降低,我可以看到它,直到它从主视图的底部消失。mainView应已调整大小,但在任何方向上都不会更改。我尝试使用setFrame和setBounds(带和不带setNeedsDisplay),但没有任何效果


我真的只是在寻找一种以编程方式更改主视图大小的方法。

我想我理解了问题所在。我仔细阅读了密码

if (!CGRectIsNull(rectIntersection)) {
    // here you set the wrong frame
    //CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
    CGRect newFrame = CGRectOffset (backgroundView.frame, 0, -2);
    [backgroundView setFrame:newFrame];
} else{
    [viewsUpdater invalidate];
    viewsUpdater = nil;
}
rectIntersection
实际上是重叠的两个视图的交点,随着
backgroundView
向下移动,该rect的高度降低。
这样,
mainView
只会调整一次大小

此外,这里有一个使用块语法的简单解决方案,用于设置视图动画,此代码通常在自定义视图控制器中执行

// eventually a control action method, pass nil for direct call
-(void)performBackgroundViewAnimation:(id)sender {
    // first, double the mainView's frame height
    CGFrame newFrame = CGRectMake(mainView.frame.origin.x,
                                  mainView.frame.origin.y,
                                  mainView.frame.size.width,
                                  mainView.frame.size.height*2);
    // then get the backgroundView's destination rect
    CGFrame newBVFrame = CGRectOffset(backgroundView.frame,
                                      0,
                                      -(backgroundView.frame.size.height));
    // run the animation
    [UIView animateWithDuration:1.0
                     animations:^{
                                     mainView.frame = newFrame;
                                     backgroundView.frame = newBVFrame;
                                 }
    ];
}

为什么不在向下移动背景视图之前或之后调整主视图的大小?
mainView
的帧大小是否与
backgroundView
的帧大小相同?尝试记录帧大小。我根本不知道如何调整视图的大小。我试着做了一个完全相同的新矩形,除了稍微高一点。将“我的图幅/边界”设置为新的矩形,但它没有更改大小。我不知道如何记录帧大小。请尝试
NSLog(@“视图帧:%.2f,%.2f”,view.frame.size.width,view.frame.size.height)成功了。我能看到画面在变化。我编辑了一些东西,现在我认为问题是框架一直在向上扩展。由于框架接近顶部,但默认情况下原点位于左下角,因此我认为它正在向上调整大小,并且没有任何变化。如何使其向下调整大小?要“向下”调整大小,请在调整大小时移动原点。尝试沿y轴将原点移动2,
CGRectMake(0,mainFrameView.origin.y-2,mainViewFrame.size.width,(mainViewFrame.size.height+2))