2012-12-04 75 views
4

我试图编程创建具有两个子视图的UILabel的容器视图,它们的行为如下:动态的UILabel带比例宽度和文本驱动高度

  • 容器宽度被固定到它的父;其高度被限制以适合
  • 标签被水平地布置,与它们(8分)
  • 之间的标准间距的左标签宽度是容器
  • 右标签宽度填充的宽度的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 == 0.25 * container.width
  • container.height> = A.height
  • container.height> = B.height

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

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

+0

我会建议作出这一在它定义一个非常简单的只有一个视图的示范项目,并将其张贴到Dropbox的(或当量)。如果你能得到一些积分,那么50的奖金也会在这里得到很多关注。有两个想法被抛弃 - 您可以要求标签根据其当前内容调整大小(或询问所需的大小),您可以告诉自动布局系统重新布局,并且如果您实现文本代表,您将知道当文字改变时。我今天没有使用autolayout的经验,但我正在积极地阅读它。 –

+0

我正在开发MonoTouch。我不认为C#演示会对大多数自动布局大师有帮助。 :-( – lencharest

回答

0

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

+0

我已经在做代码中的所有事情了,优先级不是问题,现有的一组约束条件是可以满足的 – lencharest

7

为了让您的标签自动调整高度,你需要做以下几点:

  1. 组布局限制了标签(这是你真正做了)
  2. 设置高度低优先级的约束。它应该是情人比ContentCompressionResistancePriority
  3. 设置numberOfLines = 0
  4. 集ContentHuggingPriority高于标签的HIGHT优先
  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_([email protected])]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]]; 
+0

对我不起作用http://stackoverflow.com/questions/22172572/constraints-to-specify -when-size-is-dependent-on-multiple-subviews – Geek

+0

'preferredMaxLayoutWidth'是我的关键 – atulkhatri

0

确保您设置

  1. 水平和垂直内容压缩性优先。如果您不希望标签截断其内容,请将其设置为1000.i.e. required
  2. 内容拥抱优先。看看这answer了解它是如何工作的。