具有比例宽度和文本驱动高度的动态 UILabel

Posted

技术标签:

【中文标题】具有比例宽度和文本驱动高度的动态 UILabel【英文标题】:Dynamic UILabel with proportional width and text-driven height 【发布时间】:2012-12-04 22:06:24 【问题描述】:

我正在尝试以编程方式创建一个包含两个 UILabel 子视图的容器视图,其行为如下:

容器宽度固定到其父视图;它的高度被限制为适合标签 标签水平布局,它们之间有标准间距 (8pts) 左侧标签宽度为容器宽度的25% 右标签宽度填充可用空间,减去标准水平间距 长文本应该在字边界处被打破,跨多行;两个标签都必须垂直增长以适应长文本

我已经用numberOfLines = 0lineBreakMode = NSLineBreakByWordWrapping 定义了标签。

注意容器的大小是完全动态的;它的宽度由它的父视图决定,而它的高度由它的子视图(标签)决定。标签的大小也是动态的;它们的宽度与容器宽度成正比,它们的高度取决于文本的长度。

我已经能够实现上述所有内容,除了最后一项,具有以下约束(伪代码)。 A 是左标签,B 是右标签。

A.top == container.top B.top == container.top A.leading = container.leading A.trailing == B.leading - 8 B.trailing == container.trailing A == .25 * container.width container.height >= A.height container.height >= B.height

最后两个约束旨在拉伸容器以适应较高的标签,但布局引擎似乎忽略了标签可能是多行的事实。也就是说,无论文本长度如何,我总是只显示一行。

那么我需要添加/修改/删除哪些约束才能实现上述全套行为?

【问题讨论】:

我建议制作一个非常简单的单视图演示项目,并在其中定义此内容,然后将其发布到 Dropbox(或等效的)。如果你能得到一些积分,那么 50 的赏金在这里也会引起很多关注。扔掉两个想法 - 您可以要求标签根据其当前内容调整大小(或要求它提供所需的大小),您可以告诉自动布局系统重新布局,如果您实现文本代表,您将知道当文本改变时。我今天没有使用自动布局的经验,但正在积极阅读。 我正在使用 MonoTouch 进​​行开发。我不认为 C# 演示对大多数自动布局大师有帮助。 :-( 【参考方案1】:

要让您的标签自动调整高度,您需要执行以下操作:

    为标签设置布局约束(您实际所做的) 以低优先级设置高度约束。应该比 ContentCompressionResistancePriority 更爱 设置 numberOfLines = 0 将 ContentHuggingPriority 设置为高于标签的最高优先级 为标签设置preferredMaxLayoutWidth。标签使用该值来计算其高度

例如:

self.descriptionLabel = [[[UILabel alloc] init] autorelease];
self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.descriptionLabel.preferredMaxLayoutWidth = 200;

[self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:self.descriptionLabel];

NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)];
[self addConstraints:constrs];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
[self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];

【讨论】:

不适合我。 ***.com/questions/22172572/… preferredMaxLayoutWidth 是我的关键【参考方案2】:

将标签的高度约束的优先级设置为低值并尝试在代码中设置约束。

【讨论】:

我已经在用代码做所有事情了。优先级不是问题;现有的一组约束是可以满足的。【参考方案3】:

确保你设置了

    横向和纵向内容抗压缩优先。如果您不希望标签截断其内容,请将其设置为 1000.i.e. required内容优先。查看此answer 以了解其工作原理。

【讨论】:

以上是关于具有比例宽度和文本驱动高度的动态 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个视图的高度/宽度按比例设置视图高度/宽度?

Cell内的TableView动态高度问题

如何计算边界矩形的宽度,以使文本包裹以适合特定比例?

如何在具有特定宽度和高度的矩形中获取 svg 文本元素?

表单高度和宽度的测量方式与 TextBox 高度不同

当大小不成比例时如何在 UILabel 中适合文本