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

Ios 自动调整视图大小以适应具有动态文本长度的多行标签,ios,interface-builder,autolayout,Ios,Interface Builder,Autolayout,我有一个ui视图,其中包含一个在Interface Builder.xib文件中制作的ui标签。标签文本是根据代码设置的,我希望UIView和UILabel使用自动布局调整大小以适应文本 标签配置: 销宽320 行数0 指向superview 0的前导空间 超级视图0的底部空间 superview 0的尾随空间 视图的加载方式如下所示: MyView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self opt

我有一个
ui视图
,其中包含一个在Interface Builder.xib文件中制作的
ui标签
。标签文本是根据代码设置的,我希望
UIView
UILabel
使用自动布局调整大小以适应文本

标签配置:

  • 销宽320
  • 行数0
  • 指向superview 0的前导空间
  • 超级视图0的底部空间
  • superview 0的尾随空间
视图的加载方式如下所示:

MyView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
myView.myLabel.text = @"My short or long text";
//Init headerView from nib file
//Set the content to show
[headerView setupWith:somethingToShow];              

headerView.height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
self.tableView.tableHeaderView = headerView;
我将其用作表格标题:

[self.tableView setTableHeaderView:myView];
视图不调整大小,它保持一行,并用。。。最后。如何调整它的大小

我尝试增加标签的垂直内容拥抱和内容阻力,尝试添加低优先级高度约束,尝试
设置PreferredMaxLayoutWidth
,但都没有成功

注意:这是一个简化的示例。我需要视图中的更多元素,并且我希望避免根据标签的
sizeWithFont
手动计算每个坐标。据我所知,自动布局应该是这方面的圣杯

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:

如果您使用autolayout调整标题大小,我怀疑UITableView是否能很好地与您的视图配合使用。我们处理动态大小的表页眉(或页脚)的方式如下:

MyView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
myView.myLabel.text = @"My short or long text";
//Init headerView from nib file
//Set the content to show
[headerView setupWith:somethingToShow];              

headerView.height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
self.tableView.tableHeaderView = headerView;
  • 计算标题视图的框架并调整其大小
  • 通过self.tableView.tableHeaderView=myView重新设置表头

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

    我只是遇到了和你一样的问题。
    我是这样做的:

    MyView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
    myView.myLabel.text = @"My short or long text";
    
    //Init headerView from nib file
    //Set the content to show
    [headerView setupWith:somethingToShow];              
    
    headerView.height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    self.tableView.tableHeaderView = headerView;
    

    这并不是我想要的答案,因为视图中有多个元素,您必须手动使用所有元素高度+边距的总和来更新superview的框架。必须有某种方法使用约束使自动布局自动调整大小。