iOS:multiline uilabel只显示一行自动布局

下面的代码,我认为应该导致一个多行标签后面跟着一个button,但是,布局后,只有一行标签显示出来。 虽然我可以在垂直布局中明确表示高度,这样会打破目的。 任何关于我应该适用的其他限制的想法?

UILabel *lbExplain = [[UILabel alloc] init]; lbExplain.text = @"The Sync process allows you to synchronize your library between different devices. By clicking on the button below you can find other devices to sync with. The other device also has to be running this applicaton."; lbExplain.lineBreakMode = NSLineBreakByWordWrapping; lbExplain.numberOfLines = 0; lbExplain.translatesAutoresizingMaskIntoConstraints = NO; UIButton *btnPartner = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btnPartner setTitle:@"Look for Partners" forState:UIControlStateNormal]; [btnPartner addTarget:self action:@selector(findPartners:) forControlEvents:UIControlEventTouchUpInside]; btnPartner.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:lbExplain]; [self.view addSubview:btnPartner]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[lbExplain]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lbExplain)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lbExplain]-[btnPartner]" options:NSLayoutFormatAlignAllLeft metrics:nil views:NSDictionaryOfVariableBindings(lbExplain, btnPartner)]]; 

添加行:

 lbExplain.preferredMaxLayoutWidth = 280; 

这必须是在IB中自动完成的事情,因为如果将标签设置在那里,标签将正确展开。 你传递的数字在垂直展开方面似乎并不重要,但是它并没有覆盖你为宽度设置的约束条件。

编辑后:

如果我在updateViewConstraints中添加该行,并将数字与视图的边界关联,效果会更好。 这样就可以在旋转时正确调整。

 -(void)updateViewConstraints { [super updateViewConstraints]; lbExplain.preferredMaxLayoutWidth = self.view.bounds.size.width - 40; } 

这里的问题是没有设置preferredMaxLayoutWidth 。 因此,文本不受任何宽度的限制,因此不会换行到下一行。

我发现在Autolayout中使用多行UILabel最简单的方法是创build一个子类:

 @interface MyMultilineLabel : UILabel @end @implementation MyMultilineLabel - (void)setBounds:(CGRect)bounds { [super setBounds:bounds]; CGFloat width = CGRectGetWidth(bounds); if (self.preferredMaxLayoutWidth != width) { self.preferredMaxLayoutWidth = width; } } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.lineBreakMode = NSLineBreakByWordWrapping; self.numberOfLines = 0; } return self; } @end 

你确定你没有模糊的布局吗?

你可以在你的代码中进行testing

 if ([self.view hasAmbiguousLayout]) { NSLog(@"ambiguous"); } 

或者在模拟器或testing设备上暂停并input控制台:

 po [[UIWindow keyWindow] _autolayoutTrace] 

如果是这样的话,你可能想试着让你的约束更清晰一些(乍一看,高度是模糊的):

 @"V:|-[lbExplain]-[btnPartner]-|" 

要么

 @"V:|-[lbExplain(==300)]-[btnPartner(==200)]" 

这里是视觉格式语言的文档:

http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html

我有一个类似的问题,一个UITableViewCell中的多行标签,使用AutoLayout定位,不会自行扩展。

它是在UITableView中,通过UITableViewAutomaticDimensionestimatedHeightForRowAtIndexPath方法自动处理大小。 (我认为这可能是问题的根源)

我通过打电话找出了这个问题:

 [cell layoutIfNeeded] 

cellForRowAtIndexPath方法中,就在返回单元格之前。

它的function就像一个魅力!