Cocoa 自动布局和调整子视图的大小

Posted

技术标签:

【中文标题】Cocoa 自动布局和调整子视图的大小【英文标题】:Cocoa Autolayout and Resizing of Subviews 【发布时间】:2014-02-26 13:06:42 【问题描述】:

我无法使用 Autolayout 正确调整子视图的大小。为了说明我的观点,我整理了一个简约的例子。

首先我创建了一个新的 NSViewController 并向其添加了一个子视图(在本例中为 NSTextView)并添加了 Autolayout 约束。

然后我在 MainMenu.xib 中添加了一个自定义视图,并为此设置了 Autolayout 约束。

最后,我创建了我的视图控制器的一个实例并将其视图放入我的自定义视图中。

#import "AppDelegate.h"
#import "MyViewController.h"

@interface AppDelegate()
@property (weak) IBOutlet NSView *customView;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

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


@end

由于在两个 xib 文件中都检查了“自动调整子视图”,我希望 NSTextView 在调整主窗口大小时调整大小。然而,它只是留在原地。

我在这里缺少什么?这让我困惑了几天。

谢谢, 迈克尔·克努森

【问题讨论】:

【参考方案1】:

以防万一其他人遇到同样的问题。我最终以这种方式解决了它(感谢@SevenBits 为我指明了那个方向)。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

    [self.customView addSubview:myViewController.view];

    myViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@@"subView" : myViewController.view];

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@@"subView" : myViewController.view];

    [self.customView addConstraints:verticalConstraints];
    [self.customView addConstraints:horizontalConstraints];

【讨论】:

【参考方案2】:

您的 NSTextView 的包含视图对其父级(在本例中为您的窗口)没有任何约束。您添加的视图没有调整大小,因为您的视图没有通过约束“连接”到其父级。如果您想以编程方式执行此操作,您可能需要研究 addConstraint: 方法。

更多信息请参见Apple's docs。

【讨论】:

如果您查看我帖子中的第一个屏幕截图,您会发现 NSTextView(或更准确地说是嵌入它的 NSScrollView)是我的视图控制器的 IBOutlet 视图的子视图。自动布局约束与该视图有关,对吧? 我实际上确实尝试过以编程方式进行,但不知何故最终阻止了我调整任何东西的大小。在以编程方式添加视图后,不可能“抓住”窗口角/边。猜猜是时候返回文档并再试一次了。 是的,自动布局约束是相对于视图holding(即父视图)文本视图。 嗯。那么当你说文本视图没有“连接”到它的父级时你是什么意思呢? 谢谢。现在更有意义了。我将尝试对此进行试验。请继续关注:-)

以上是关于Cocoa 自动布局和调整子视图的大小的主要内容,如果未能解决你的问题,请参考以下文章

(自动布局)容器视图调整大小但子视图不

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

使用自动布局动态更改子视图后调整超级视图的大小

从 Xib 加载视图在自动布局后调整框架子视图的大小

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用

如何使用自动布局调整视图大小以适合标签子视图?