使用窗口调整自定义视图的大小

Posted

技术标签:

【中文标题】使用窗口调整自定义视图的大小【英文标题】:Resizing a custom view with the window 【发布时间】:2013-02-20 14:11:13 【问题描述】:

所以我已经看到这个问题被问了几次,但还没有找到解决我问题的答案。现在我基本上有 MainMenu.xib,其顶部有一个标签,一个大的自定义视图和一个底部居中的按钮,用于切换自定义视图的子视图(见下图)。我已经在界面构建器中将窗口和自定义视图设置为自动调整子视图的大小,并且所有按钮、标签等都有与视图侧面相关的约束,但是当我调整窗口大小时,子视图的内容会不调整大小。我认为自定义视图正在随着窗口调整大小,因为当我使用按钮切换子视图时,加载的子视图会随着窗口调整大小,它们只是没有实时调整窗口大小。

MainMenu.xib:

普通子视图:

窗口展开后:

子视图切换然后又切换回来:

约束:

MainMenu.xib:

BlockViewController.xib:

【问题讨论】:

什么是“弹簧和支柱”?我在界面生成器中使用带有对齐和固定选项的自动布局。我将上传带有约束显示的 xib 的屏幕截图。 @Monolo 这不是高度限制,而是将视图在窗口中居中对齐。 @Monolo 这是我将 BlockViewController 添加到自定义视图时的代码:[self.customView addSubview: self.blockSubView.view]; self.blockSubView.view.frame = self.customView.bounds; 【参考方案1】:

想通了!真的很简单,只要在每个 ViewController 子类的 awakeFromNib 方法中写一行代码即可:

[self.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

【讨论】:

也适合我!我刚刚在 builder 中添加了约束,并在 awakeFromNib 中为视图添加了此代码。【参考方案2】:

从图片和cmets中的描述看,问题似乎是自定义视图没有得到任何布局约束来决定如何调整子视图的大小。

以下代码(直接在浏览器中输入,所以要小心)应该提供必要的约束来将子视图的边框“粘合”到自定义视图。

[self.customView addSubview: self.blockSubView.view];
self.blockSubView.view.frame = self.customView.bounds;

NSView *blockSubView = self.blockSubView.view;

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(blockSubView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[blockSubView]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewsDictionary];


constraints = [constraints arrayByAddingObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat:@"V|[blockSubView]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewsDictionary]];

[self.customView addConstraints: constraints];

docs 中有更多关于此的信息。注意调试技巧 - 非常有用,以至于不可或缺。

【讨论】:

谢谢!出于某种原因,这段代码使我无法调整窗口大小 @MattCooper 那是因为内部视图(您添加的那个)的约束不允许调整它的大小。你试过调试技巧吗? 我只用 1 行代码就搞定了哈哈,感谢您的所有帮助以及文档/调试技术的链接。我相信这些真的会派上用场。

以上是关于使用窗口调整自定义视图的大小的主要内容,如果未能解决你的问题,请参考以下文章

自定义视图不使用自动布局调整大小

如何以编程方式调整自定义视图的大小?

在自定义容器视图中旋转时 AutoLayout 不会调整视图大小?

自定义表格单元格未调整大小以适合内容视图

调整自定义视图的报告大小以包括绘制的图形

调整窗口大小时带有约束的宽度限制