gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:23:15 24 4
gpt4 key购买 nike

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

  • 容器宽度固定到它的父 View ;它的高度被限制为适合标签
  • 标签水平放置,标签之间有标准间距(8pts)
  • 左侧标签宽度为容器宽度的25%
  • 右边的标签宽度填满可用空间,减去标准水平间距
  • 长文本应该在单词边界处断开,因为它会跨多行流动;两个标签都必须垂直增长以适应长文本

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

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

除最后一项外,我已经能够通过以下约束(伪代码)实现上述所有内容。 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

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

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

最佳答案

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

  1. 为标签设置布局约束(即您实际所做的)
  2. 设置低优先级的高度限制。它应该比 ContentCompressionResistancePriority 好
  3. 设置 numberOfLines = 0
  4. 将 ContentHuggingPriority 设置为高于标签的最高优先级
  5. 为标签设置 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_)]];

关于ios - 具有比例宽度和文本驱动高度的动态 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13712795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com