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

Ios 具有比例宽度和文本驱动高度的动态UILabel,ios,autolayout,Ios,Autolayout,我试图以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下: 容器宽度固定到其superview;其高度将被约束以适合标签 标签水平布置,标签之间有标准间距(8pts) 左侧标签宽度为容器宽度的25% 右标签宽度填充可用空间,减去标准水平间距 长文本应在单词边界处断开,并在多行之间流动;两个标签必须垂直增长以容纳长文本 我已经用numberOfLines=0和lineBreakMode=NSLineBreakByWordWrapping定义了标签 请注意,容器的大小是完全动态

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

  • 容器宽度固定到其superview;其高度将被约束以适合标签
  • 标签水平布置,标签之间有标准间距(8pts)
  • 左侧标签宽度为容器宽度的25%
  • 右标签宽度填充可用空间,减去标准水平间距
  • 长文本应在单词边界处断开,并在多行之间流动;两个标签必须垂直增长以容纳长文本
我已经用
numberOfLines=0
lineBreakMode=NSLineBreakByWordWrapping
定义了标签

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

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

  • A.top==container.top
  • B.top==container.top
  • A.leading=容器
  • A.尾随==B.前导-8
  • B.trailing==容器。trailing
  • A==.25*container.width
  • 容器高度>=A高度
  • 容器高度>=B高度
最后两个约束旨在拉伸容器以适合较高的标签,但布局引擎似乎忽略了标签可能是多行的这一事实。也就是说,无论文本的长度如何,我总是显示一行


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

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

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

  • 为标签设置布局约束(实际操作)
  • 设置低优先级的高度约束。它应该是爱人,而不是知足常乐
  • 设置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_)]];
    
    一定要做好准备

  • 水平和垂直内容压缩阻力优先级。如果不希望标签截断其内容,请将其设置为1000<代码>必填项
  • 内容优先权。看看这个,了解它是如何工作的

  • 我建议制作一个非常简单的单视图演示项目,并将其发布到Dropbox(或同等版本)。如果你能得到一些分数,50分的悬赏在这里也会引起很多关注。要抛弃的两个想法-您可以要求标签根据其当前内容调整大小(或要求其提供所需的大小),您可以告诉自动布局系统重新布局,如果您实现文本代理,您将知道文本何时更改。我今天没有autolayout的经验,但我正在积极阅读。我正在MonoTouch中开发。我认为C#demo对大多数的自动布局大师没有帮助-(我已经在用代码做所有事情了。优先级不是问题;现有的约束集是可以满足的。不适合我。
    preferredMaxLayoutWidth
    是我的关键