多行 UILabel 高度,横向自动布局更高

Posted

技术标签:

【中文标题】多行 UILabel 高度,横向自动布局更高【英文标题】:Multiline UILabel height with Autolayout higher in landscape 【发布时间】:2014-05-14 18:14:10 【问题描述】:

请查看这个带有自动布局的动态多行UILabel 的简单示例,该示例应强制其超级视图增加高度。该示例在纵向上运行良好,而在横向上,UILabel 的高度增长过多。

我在 storyboard 中设置了约束,标签的垂直压缩和拥抱优先级是 1000,superview 是 1。视图之间的所有其他顶部、底部、前导和尾随约束都是标准的。

我用非常浅的灰色为标签的背景着色,因此很明显标签的顶部和底部边距比纵向模式大得多。有人可以告诉我如何在横向上获得具有相同顶部和底部边距的标签吗?谢谢。

- (void)viewDidLoad

    [super viewDidLoad];
    self.myTextLabel.text = @"iPhone 6 rumoured to have larger display.";


- (IBAction)button:(UIButton *)sender

    if (!self.flag) 
        self.innerHeightConstraint.constant = 120.0;
        self.myTextLabel.text = @"iPhone 6 rumoured to have larger, 1704 x 960 display. A new report indicates that Apple's testing it.";
        self.flag = YES;
     else 
        self.innerHeightConstraint.constant = 60.0;
        self.myTextLabel.text = @"iPhone 6 rumoured to have larger display.";
        self.flag = NO;
    
    [self.view layoutIfNeeded];

【问题讨论】:

【参考方案1】:

我认为您正在使用多行标签和自动布局来解决特定问题。有关详细说明,请参阅Advanced Auto Layout Toolbox(多行文本的内在内容大小)。

快速解决方法是将其放入您的视图控制器中:

- (void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [self.view layoutIfNeeded];

虽然我建议在链接中描述的容器视图解决方案中使用自定义标签类或覆盖 layoutSubviews。

【讨论】:

感谢您的回答以及解释链接。现在我可以解决它并知道它为什么会发生。【参考方案2】:

我已经通过在boundingRectWithSize: 方法中直接计算UILabel 高度解决了这个问题,但这是避免使用自动布局目的的捷径,所以我仍然希望对此提供任何反馈。

NSDictionary *attributes = @NSFontAttributeName : [UIFont systemFontOfSize:16.0];
CGRect textLabelRect = [self.myTextLabel.text boundingRectWithSize:CGSizeMake(self.view.bounds.size.width - 40.0, 9999.0) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil];

CGFloat height = textLabelRect.size.height + someMagicNumber;

【讨论】:

以上是关于多行 UILabel 高度,横向自动布局更高的主要内容,如果未能解决你的问题,请参考以下文章

iOS:多行 uilabel 仅显示带有自动布局的一行

UITableHeaderView 自动布局中的 UILabel 不适用于 iPhone 6

如何在通知内容扩展中使用多行 UILabel / 自动布局调试布局

具有自动布局配置的 UITableCell 被截断的多行 UILabel

如何将自动布局约束添加到 tableview headerView 内的多行 UILabel?

iOS:自动布局中的多行 UILabel