【问题标题】:Resize Window and contained NSView based on subviews size根据子视图大小调整窗口大小并包含 NSView
【发布时间】:2022-01-18 00:32:27
【问题描述】:

对于 MacOS 应用程序,我有一个窗口,其中包含 NSView;在该视图中,我想添加一个具有恒定大小和高度的子视图。

[myView addSubview:mySubview] 以编程方式加载子视图时,我希望托管子视图的NSView *myView 改变大小,以便它适应子视图,并相应地改变窗口大小;以便该窗口内的 NSView 的边缘与窗口中的周围环境保持相同的距离。我如何最有效地实现这一点,我必须在 IB 中指定哪些属性才能使其工作?我是否必须手动以编程方式调整 myView 和窗口的大小,或者我可以以更漂亮的方式实现这一点?

【问题讨论】:

  • 美丽是品味的问题。自动布局怎么样?
  • 真的,谢谢。看来我得先了解一下 AutoLayout 系统的概念和组件。很久没有使用 Cocoa 和整个 Apple 的编码领域工作了......我会在完成学习后立即发布完整的答案。

标签: objective-c cocoa


【解决方案1】:

正如@Willeke 所建议的,我需要了解和应用自动布局。为了让它在 IB 中工作,我将我的子视图的 autoresizingMask 设置为坚持所有边并自动调整宽度和高度。即使它可以完全在 IB 中完成,我认为以编程方式这将是

subview.autoresizingMask = NSViewWidthSizable | NSViewHeightSizeable;

正如@Ol Sen 在他的回答中指出的那样,Translates Mask Into Constraints 也必须被激活。

为了在以编程方式添加的子视图中排列元素,如开篇文章中所述,我依赖嵌套的堆栈视图并调整它们的大小,而不是调整父视图的大小。

剩下的唯一问题是在添加之前正确调整子视图的框架以匹配父视图。如果忽略此步骤,则在添加子视图的自动调整大小掩码时将转换为约束,这将导致正确的调整大小行为,但边距错误。基本代码如下所示:

MySubViewController *subViewController = [[MySubViewController alloc] init];
subViewController.view.frame = superView.bounds; // Correct the margins
[superView addSubview:subViewController.view];

【讨论】:

    【解决方案2】:

    有多种方法可以实现这一点。
    一个简单的方法是将autoresizingMask 设置为您想要的值。 您可以在 Interface Builder 中看到的掩码由预定义的数字 (NSAutoresizingMaskOptions) 表示,您将与位操作结合使用

    view.autoresizingMask = NSViewMaxXMargin | NSViewMaxYMargin;
    

    这类似于 IB 截图中的自动调整大小

    LayoutTranslates Mask Into Constraints 上的复选标记必须在 IB 中或以编程方式进行,以便将它们用作约束。

    view.translatesAutoresizingMaskIntoConstraints = YES;
    

    当视图使用
    -initWithFrame: 和给定的 frame 实例化或使用 IB 在创建实例并初始化UI 元素通过-initWithCoder:

    请注意,这不会停止 IB 的自动布局机制,以警告您所需的坐标、大小和约束可能与约束发生冲突。

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多