NSTextField和AutoLayout:自动增长高度 - >以编程方式

问题描述:

如果我在界面构建器中创建一个标签并通过代码设置字符串不符合其当前大小,则标签将垂直增长以适合其大小,太棒了! 除了x约束,Xcode还创建了一个NSContentSizeLayoutConstraint,它包含拥抱和压缩阻力。NSTextField和AutoLayout:自动增长高度 - >以编程方式

这里是约束

<NSContentSizeLayoutConstraint:0x6080000a11a0 V:[NSTextField:0x600000180c30(17)] Hug:750 CompressionResistance:750> 

的问题是一个日志输出,如何以编程方式做到这一点?我还没有找到方法。没有办法创建一个NSContentSizeLayoutConstraint,并且设置NSTextField的contentCompressionResistance似乎没有任何作用。

这里是我的代码:

self.label = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 20)]; 
[self.label setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.label setBordered:YES]; 
[[self.label cell] setLineBreakMode:NSLineBreakByWordWrapping]; 
[self.window.contentView addSubview:self.label]; 
self.label.stringValue = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 

NSDictionary *dict = @{@"label" : self.label}; 
[self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]"options:0 metrics:nil views:dict]]; 
[self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]" options:0 metrics:nil views:dict]]; 

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:40]; 
constraint.priority = 1; 
[self.label addConstraint:constraint]; 
constraint = [NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:18]; 
constraint.priority = 1; 
[self.label addConstraint:constraint]; 

[self.label setContentCompressionResistancePriority:1000 forOrientation:NSLayoutConstraintOrientationHorizontal]; 
[self.label setContentCompressionResistancePriority:1000 forOrientation:NSLayoutConstraintOrientationVertical]; 

设置文本字段的preferredMaxLayoutWidth。我认为你不想要或不需要显式宽度约束。


在我的测试中,我发现这个工程:

self.label = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 18)]; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
[self.label.cell setLineBreakMode:NSLineBreakByWordWrapping]; 
self.label.stringValue = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
self.label.preferredMaxLayoutWidth = 100; 
self.label.editable = NO; 

[self.window.contentView addSubview:self.label]; 

NSDictionary* views = @{ @"label" : self.label }; 
[self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]" options:0 metrics:nil views:views]]; 
[self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]" options:0 metrics:nil views:views]]; 

基本上,从你的主要区别是,我设置editableNO。我也忽略了宽度和高度的限制,并设置了抗压强度。

+0

感谢您的想法,但我得到一个布局是模糊的消息,当设置prefferedMaxLayoutWidth,而不是设置宽度约束。我也在同一时间尝试过它们,但抗压性不受尊重。 – 2014-09-19 17:30:40

+0

尝试'[self.label setScrollable:NO]'。如果这不起作用,我建议您创建您在IB中说的设置,然后检查文本字段及其单元格的所有相关属性,并确保匹配。确保不仅查询在'NSTextField'和'NSTextFieldCell'中声明的属性,而且还查询它们的超类。此外,让IB在文本字段中添加缺失或建议的约束。我怀疑你会发现它既没有高度也没有宽度限制,并且允许那些来自文本字段的固有尺寸。 – 2014-09-20 19:54:26

+0

就是这样,我不知道IB如何添加这个“NSContentSizeLayoutConstraint”。它是一个私人班。我向Apple提出技术支持请求,我会在得到答案时更新问题。 – 2014-09-20 23:11:04