【问题标题】:Programmatically resize NSView以编程方式调整 NSView 的大小
【发布时间】:2011-07-17 09:12:21
【问题描述】:

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

if (!CGRectIsNull(rectIntersection)) {
    CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
    [backgroundView setFrame:newFrame];
} else{
    [viewsUpdater invalidate];
    viewsUpdater = nil;
}

rectIntersection 用于判断视图何时完全向下移动并且不再位于前面的视图后面(当它们不再重叠时,rectIntersection 为空),它一次向下移动 2 个像素,因为这都在重复计时器。我希望我的主视图,即包含这两个其他视图的主视图,向下调整大小,以便它在背景中的视图被降低时扩展。这是我正在尝试的代码:

CGRect mainViewFrame = [mainView frame];
if (!CGRectContainsRect(mainViewFrame, backgroundFrame)) {
    CGRect newMainViewFrame = CGRectMake(0,
                                         0,
                                         mainViewFrame.size.width,
                                         (mainViewFrame.size.height + 2));
    [mainView setFrame:newMainViewFrame];
}

这个想法是检查 mainView 是否包含这个背景视图。当 backgroundView 降低时,主视图不再包含它,它(应该)向下扩展 2 个像素。这种情况会发生,直到背景视图停止移动并且主视图最终包含背景视图。

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

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

【问题讨论】:

  • 为什么不在backgroundView 向下移动之前或之后调整mainView 的大小? mainView 的帧大小与backgroundView 的帧大小相同吗?尝试记录帧大小。
  • 我完全不知道如何调整视图大小。我尝试制作一个完全相同的新矩形,除了高度稍大一些。将我的视图框架/边界设置为该新矩形,但它没有改变大小。而且我不知道如何记录帧大小。
  • 试试NSLog(@"view frame : %.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));。

标签: objective-c cocoa resize nsview cgrect


【解决方案1】:

我想我明白了,问题是什么。我仔细阅读了代码。

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 向下移动,矩形的高度减小。
这样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;
                                 }
    ];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多