当前位置:  开发笔记 > 运维 > 正文

NSView的自动调整行为

如何解决《NSView的自动调整行为》经验,为你挑选了1个好方法。

我需要了解NSView如何自动化它的视图.我已经在IB中设置了所有内容,并且我的子视图调整得很好(当我用鼠标调整窗口大小时).但是,如果我[myMainView setFrame:]使用我的新帧rect,则没有任何反应.我的所有子视图仍然是原始大小(即使主视图具有正确的尺寸).孩子resizeWithOldSuperviewSize:被召唤,但它的大小仍然不合适.

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

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

我误解了自动调整的工作方式吗?如何手动触发NSView下的自动调整机制?

我可以做两件事:

    根据当前屏幕大小相对于原始大小手动调整元素大小.这个选项不是我最喜欢的,因为看起来,我不得不重写已经在NSView中工作的代码(自动调整行为)

    我的第二个选择是调用前面提到的NSView的自动化魔法.文档暗示[NSView setFrame:]会为我做这件事.我试过的是,将我的内容视图调整为原始屏幕大小(800x600),渲染我的元素,然后将其调整为当前窗口大小.从概念上讲,它与手动调整窗口大小不同吗?似乎不是.同样,这个选项更可取,因为它最大限度地减少了可以编写和维护的代码量.

Nikolai Ruhe.. 20

这段代码

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}}

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

对于您的问题,一个很好的解决方案可能是使用没有选项卡的NSTabView,因为那时您的所有视图始终都在窗口中(可能是隐藏的),并且tabview负责调整大小.

另一个解决方案是将几个视图放在彼此之上,并用于setHidden:仅显示一个视图.



1> Nikolai Ruhe..:

这段代码

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}}

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

对于您的问题,一个很好的解决方案可能是使用没有选项卡的NSTabView,因为那时您的所有视图始终都在窗口中(可能是隐藏的),并且tabview负责调整大小.

另一个解决方案是将几个视图放在彼此之上,并用于setHidden:仅显示一个视图.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有