gpt4 book ai didi

cocoa - NSView 的自动调整大小行为

转载 作者:行者123 更新时间:2023-12-03 16:08:08 28 4
gpt4 key购买 nike

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

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

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

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

我可以做两件事:

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

最佳答案

这段代码

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]));

确实给出了预期的结果:

[...] subview's frame before resizing: {{0, 0}, {100, 100}}[...] subview's frame after  resizing: {{0, 0}, {200, 100}}

您的问题出在其他地方。我希望在调整大小时,您的容器 View 之一不是窗口 View 层次结构的一部分。

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

另一种解决方案是将多个 View 放在彼此之上,并使用 setHidden: 仅显示一个 View 。

关于cocoa - NSView 的自动调整大小行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com