2014-09-19 81 views
1

如果我在界面構建器中創建一個標籤並通過代碼設置字符串不符合其當前大小,則標籤將垂直增長以適合其大小,太棒了! 除了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]; 

回答

2

設置文本字段的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

相關問題