【问题标题】:NSView's autoresizing behaviorNSView 的自动调整大小行为
【发布时间】:2010-11-01 08:14:55
【问题描述】:

我需要了解 NSView 如何自动调整其视图大小。我已经在 IB 中设置了所有内容,并且我的子视图很好地调整了大小(当我用鼠标调整窗口大小时)。但是,如果我用我的新框架矩形做[myMainView setFrame:],什么都不会发生。我所有的子视图仍然是原始大小(即使主视图具有正确的尺寸)。 Child 的 resizeWithOldSuperviewSize: 被调用,但大小仍然不合适。

我在屏幕(屏幕 #1)、标签、图像、视频上有一个充满可可元素的屏幕。这些元素有一个定义明确的布局。我已经通过界面生成器设置了自动调整大小的行为,效果很好。调整主窗口的大小以令人满意的方式调整元素的大小。

现在,用户单击“下一步”按钮,然后将绘制第二个全屏元素(屏幕#2)。我的布局是基于规范的屏幕尺寸(比如 800x600)构建的。但是现在窗口更大(或更小),因为它在屏幕 #1 中调整了大小。所以元素现在只占用窗口中的一小块区域,而不是适当地调整大小以填充可用空间。我想缩放这些元素。

我是否误解了自动调整大小的工作原理?如何手动触发 NSView 下的自动调整大小机制?

我可以做两件事:

  1. 根据当前屏幕尺寸相对于原始尺寸手动调整元素的大小。这个选项不是我最喜欢的,因为看起来,我不得不重写已经在 NSView 中工作的代码(自动调整大小的行为
  2. 我的第二个选项是调用前面提到的 NSView 的自动调整大小魔法。文档暗示 [NSView setFrame:] 将为我做到这一点。我尝试过的是,将我的内容视图调整为原始屏幕大小(800x600),渲染我的元素,然后将其调整为当前窗口大小。从概念上讲,它与手动调整窗口大小不同吗?它似乎不是。同样,这个选项更可取,因为它最大限度地减少了需要编写和维护的代码量。

【问题讨论】:

  • 我不确定你的意思。父母的 resizeSubviewsWithOldSize 被调用,setAutoresizesSubviews 设置为yes。请您提供更多指导吗?
  • 前者是因为后者——如果 autoresizesSubviews 设置为 YES,那么 resizeSubviewsWithOldSize: 应该会被自动调用。既然你已经设置好了并且正在发生这种情况,我也很难过。对不起。
  • 不知道为什么关闭它,因为它与我面临的完全相同的问题......

标签: cocoa macos nsview autoresize


【解决方案1】:

这段代码

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
NSView* subView   = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[superView addSubview:subView];

[superView setAutoresizesSubviews:YES];
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame]));
[superView setFrame:NSMakeRect(0, 0, 200, 100)];
NSLog(@"subview's frame after  resizing: %@", NSStringFromRect([subView frame]));

确实给出了预期的结果:

[...] 子视图在调整大小之前的框架:{{0, 0}, {100, 100}}
[...] 调整大小后的子视图框架:{{0, 0}, {200, 100}}

你的问题在别处。我希望在发生调整大小时,您的容器视图之一不是窗口视图层次结构的一部分。

对于您的问题,一个好的解决方案可能是使用不带标签的 NSTabView,因为这样您的所有视图始终都在窗口中(可能隐藏),并且标签视图负责调整大小。

另一种解决方案是将多个视图放在一起,并使用setHidden: 仅显示一个。

【讨论】:

  • 这是一个有趣的想法,关于渲染所有视图。不幸的是,一些视图需要相当多的处理,足以昂贵。好主意!
【解决方案2】:

事实证明我的方法是正确的。我将帧大小设置为不正确的值,因此我没有得到预期的行为。呵呵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多