Ios 具有比例宽度和文本驱动高度的动态UILabel
我试图以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下:Ios 具有比例宽度和文本驱动高度的动态UILabel,ios,autolayout,Ios,Autolayout,我试图以编程方式创建一个包含两个UILabel子视图的容器视图,其行为如下: 容器宽度固定到其superview;其高度将被约束以适合标签 标签水平布置,标签之间有标准间距(8pts) 左侧标签宽度为容器宽度的25% 右标签宽度填充可用空间,减去标准水平间距 长文本应在单词边界处断开,并在多行之间流动;两个标签必须垂直增长以容纳长文本 我已经用numberOfLines=0和lineBreakMode=NSLineBreakByWordWrapping定义了标签 请注意,容器的大小是完全动态
- 容器宽度固定到其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高度
那么,为了实现上述全套行为,我需要添加/修改/删除哪些约束?将标签高度约束的优先级设置为低值,并尝试在代码中设置约束。要使标签自动调整高度,需要执行以下操作:
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_)]];
一定要做好准备
我建议制作一个非常简单的单视图演示项目,并将其发布到Dropbox(或同等版本)。如果你能得到一些分数,50分的悬赏在这里也会引起很多关注。要抛弃的两个想法-您可以要求标签根据其当前内容调整大小(或要求其提供所需的大小),您可以告诉自动布局系统重新布局,如果您实现文本代理,您将知道文本何时更改。我今天没有autolayout的经验,但我正在积极阅读。我正在MonoTouch中开发。我认为C#demo对大多数的自动布局大师没有帮助-(我已经在用代码做所有事情了。优先级不是问题;现有的约束集是可以满足的。不适合我。
preferredMaxLayoutWidth
是我的关键