自动调整视图以适合具有动态文本长度的多行标签

时间:2013-11-19 13:22:20

标签: ios interface-builder autolayout

我有一个UIView包含在Interface Builder .xib文件中创建的UILabel。标签文本是从代码设置的,我希望UIViewUILabel调整大小以适应使用自动布局的文本。

标签配置:

  • 固定宽度320
  • 行数0
  • 领导空间到superview 0
  • 底部空间到superview 0
  • 追踪空间到superview 0

视图加载如下:

MyView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
myView.myLabel.text = @"My short or long text";

我将它用作表头:

[self.tableView setTableHeaderView:myView];

视图没有调整大小,它在最后用...截断一行。如何让它调整大小?

我尝试增加标签的垂直内容拥抱和内容阻力,我尝试添加低优先级高度约束,我尝试setPreferredMaxLayoutWidth,一切都没有运气。

注意:这是一个简化的例子。我将在视图中需要更多元素,并且我希望避免根据标签sizeWithFont手动计算每个坐标。我的理解是,汽车布局应该是这个的圣杯。

3 个答案:

答案 0 :(得分:0)

CGSize maximumSize = CGSizeMake(maxWidthOfYourLabel, 9999);
UIFont *myFont = label.font;
CGSize myStringSize = [yourString sizeWithFont:myFont constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping]; 
label.frame = CGRectMake (label.frame.origin.x, label.frame.origin.y, myStringSize.width, myStringSize.height);

yourView.height = label.height;

这是我所知道的唯一方式,这涉及sizeWithFont:

答案 1 :(得分:0)

如果您使用autolayout调整其标题大小,我怀疑UITableView会很好地与您的视图一起使用。我们使用动态大小的表头(或页脚)的方式是这样的:

  1. 计算并调整标题视图的框架大小。
  2. 通过self.tableView.tableHeaderView = myView;
  3. 重新设置标题

    第2步是关键。即使应用相同的视图,您也必须再次设置tableHeaderView。我知道必须在自动布局范例中使用框架非常难看,但如果找到放置self.tableView.tableHeaderView = myView;的正确方法,则可能不必这样做。

答案 2 :(得分:0)

我遇到了和你一样的问题。
我的工作是这样的:

//Init headerView from nib file
//Set the content to show
[headerView setupWith:somethingToShow];              

headerView.height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
self.tableView.tableHeaderView = headerView;