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

时间:2012-12-04 22:06:25

标签: ios autolayout

我正在尝试以编程方式创建一个包含两个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

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

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

3 个答案:

答案 0 :(得分:7)

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

  1. 设置标签的布局约束(实际上已经完成)
  2. 设置低优先级的高度约束。它应该比ContentCompressionResistancePriority
  3. 更可爱
  4. 设置numberOfLines = 0
  5. 将ContentHuggingPriority设置为高于标签的高优先级
  6. 为label设置preferredMaxLayoutWidth。标签使用该值来计算其高度
  7. 例如:

    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_)]];
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

确保设置

  1. 水平和垂直内容压缩阻力优先。如果您不希望标签截断其内容,请将其设置为1000.i.e。 required
  2. 内容拥抱优先级。请查看此answer以了解其工作原理。