0

我正在尝试NSView使用视觉自动布局创建动态大小。我正在尝试实现类似下图的效果。

在此处输入图像描述

我添加了以下约束来实现这一点。

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-15-[_iconImageView(39)]-12-[_textView(239)]-15-|"
                                                             options:NSLayoutFormatAlignAllTop metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[_textView]-4-[_mainButton]-5-|"
                                                             options: NSLayoutFormatAlignAllLeft metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_mainButton]-15-[_secondaryButton]"
                                                             options:NSLayoutFormatAlignAllTop metrics:nil views:views]];

但这会创建以下布局。

在此处输入图像描述

根据我的理解,以下 VFL 将从顶部开始布局 _textView 15px,然后在距离 _textView 底部 4px 后布局 _mainButton。但实际上 _mainbottom 是距离 _textView 顶部 4px 后的布局。我在这里错过了什么吗?

@"V:|-15-[_textView]-4-[_mainButton]-5-|"

更新


我替换NSTextViewNSTextField. 但现在的问题是,NSTextField 不会增长超过单行高度,而是NSTextField多行。布局和设置视图的完整代码如下。

-(void)setupView {
    _textField = [[NSTextField alloc] initWithFrame:NSZeroRect];
    [[_textField cell] setWraps:YES];
    [_textField setLineBreakMode:NSLineBreakByWordWrapping];
    [[_textField cell] setTitle:@"This is a _textView, This will contain dynamic resizing text."];

    [_textField setSelectable:NO];
    [_textField setEditable:NO];
    [_textField setDelegate:self];
    [_textField setBordered:NO];
    [_textField sizeToFit];
    [_textField setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self addSubview:_textField];
    
    _iconImageView = [[NSImageView alloc] initWithFrame:NSZeroRect];
    [_iconImageView setImage:[NSImage imageNamed:@"notify-warning-icon"]];
    [_iconImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self addSubview:_iconImageView];
    
    _mainButton = [[NSButton alloc] init];
    _mainButton.translatesAutoresizingMaskIntoConstraints = NO;
    [_mainButton setTitle:@"_mainButton"];
    [self addSubview:_mainButton];
    
    _secondaryButton = [[NSButton alloc] init];
    _secondaryButton.translatesAutoresizingMaskIntoConstraints = NO;
    [_secondaryButton setTitle:@"_secondaryButton"];
    [self addSubview:_secondaryButton];
    
    NSDictionary *views = NSDictionaryOfVariableBindings(_textField,_iconImageView,_mainButton,_secondaryButton);
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-15-[_iconImageView(39)]-12-[_textField(239)]-15-|"
                                                                 options:NSLayoutFormatAlignAllTop metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[_textField]-4-[_mainButton]-5-|"
                                                                 options: NSLayoutFormatAlignAllLeft metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_mainButton]-15-[_secondaryButton]"
                                                                 options:NSLayoutFormatAlignAllTop metrics:nil views:views]];
    
    [self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:0.f constant:320.f]];
}

在此处输入图像描述

但如果它改变了这一点

@"V:|-15-[_textField]-4-[_mainButton]-5-|"

有了这个

@"V:|-15-[_textField(>=40)]-4-[_mainButton]-5-|"

我得到以下输出

在此处输入图像描述

但问题是文本字段内容是动态的,并且可能在运行时发生变化,它可能是 2 行、3 行等。所以我如何添加一些高度约束将根据其内容NSTextField改变高度。NSTextField

4

1 回答 1

4

您可以使用文本字段而不是文本视图并设置其preferredMaxLayoutWidth属性。

默认情况下,如果preferredMaxLayoutWidth为 0,则文本字段将计算其固有大小,就好像它的内容被排成一行一样(或者,至少,没有任何最大宽度)。即使您应用限制其实际宽度的约束,也不会改变其固有高度,因此它通常不会高到足以包含包装的文本。

如果设置preferredMaxLayoutWidth,则文本字段将根据包裹到该宽度的文本计算其固有大小。这包括使其内在高度足够高以适应。

于 2015-04-09T19:26:57.327 回答