考虑我在UILabel(动态文本的长行)中有以下文本:
由于外星军队的数量远远超过了团队,因此玩家必须利用后世界末日的世界,例如在垃圾箱,支柱,汽车,瓦砾和其他物体后面寻找掩护.
我想调整UILabel's高度,以便文本可以适应.我正在使用以下属性UILabel来使文本包装.
myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;
Run Code Online (Sandbox Code Playgroud)
如果我没有朝着正确的方向前进,请告诉我.谢谢.
在过去的3到4个小时里,我一直把头撞在墙上,我似乎无法弄明白.我有一个UIViewController,里面有一个全屏UITableView(屏幕上有一些其他的东西,这就是为什么我不能使用UITableViewController)我想让我的tableHeaderView用autolayout调整大小.不用说,它不合作.
见下面的截图.

因为overviewLabel(例如"此处列出概述信息."文本)具有动态内容,所以我使用autolayout来调整它的大小和它的超级视图.除了tableHeaderView之外,我已经很好地调整了所有内容,它位于层次结构中的Paralax Table View之下.
我发现调整标题视图大小的唯一方法是以编程方式,使用以下代码:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,headerFrameHeight是tableViewHeader高度的手动计算,如下所示(innerHeaderView是白色区域,或者第二个"View",headerView是tableHeaderView):
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Run Code Online (Sandbox Code Playgroud)
手动计算有效,但如果将来发生变化,它会很笨拙并容易出错.我想要做的是让tableHeaderView根据提供的约束自动调整大小,就像你可以在其他地方一样.但对于我的生活,我无法弄明白.
关于这个问题有几个关于此的帖子,但没有一个是明确的,最后让我更加困惑.这里有几个:
以下问题是这个问题的延续:
主要思想是每个视图都应该声明它是"首选"(内在)大小,以便AutoLayout可以知道如何正确显示它.UILabel只是一个视图无法知道显示所需大小的情况的示例.这取决于提供的宽度.
正如mwhuss指出的那样,setPreferredMaxLayoutWidth实现了使标签跨越多行的技巧.但这不是主要问题.问题是我在何时何地获得此宽度值作为参数发送到setPreferredMaxLayoutWidth.
我设法制作看似合法的东西,所以如果我错了,请纠正我,如果你知道更好的方法,请告诉我.
在UIView的
-(CGSize) intrinsicContentSize
Run Code Online (Sandbox Code Playgroud)
我setPreferredMaxLayoutWidth根据self.frame.width我UILabels.
UIViewController的
-(void) viewDidLayoutSubviews
Run Code Online (Sandbox Code Playgroud)
是我知道的第一个回调方法,主视图的子视图是用它们在屏幕上居住的确切帧来指定的.然后,从该方法I内部操作我的子视图,使其内在大小无效,以便UILabel根据指定给他们的宽度分成多行.
我的静态表视图单元格中有三个标签,中间标签应该是多行标签.
我正在设置这两行 viewDidLoad()
self.tableView.estimatedRowHeight = 130.0
self.tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)
故事板看起来像这样
以下是每个子视图的约束
顶部标签,中间标签,底部标签,按钮
我还将中间标签的行数设置为0.但是它只显示一行而不是多行.我想它必须与内容拥抱或内容压缩优先级有关,或者因为我正在使用UITableViewController静态单元格.
UPDATE
如果我将中间标签的垂直压缩阻力优先级更改为751并将垂直内容拥抱优先级更改为250,则标签显示多行,但单元格不会调整大小,因此顶部和底部标签现在位于单元格之外.
更新2
我刚刚创建了一个示例项目,事实证明它可以按预期使用动态单元格,但不能使用静态单元格.您可以在此处下载示例项目:https://dl.dropboxusercontent.com/u/67692950/ResizingCell.zip
我需要插入到UILabel多行文本.我做以下事情:
NSMutableString * spName = [[NSMutableString alloc ]initWithString:@""];
for (NSUInteger i=0; i<arrEx.count; ++i)
{
ExInfo * exInf = [arrEx objectAtIndex:i];
[spName appendString:[MyObject getName:exInf.spNum]];
[spName appendString:@" "];
[spName appendString:exInf.totalTime];
[spName appendString:@"\n"];
}
CGSize size = [spName sizeWithFont:[UIFont systemFontOfSize:14]
constrainedToSize:constraint
lineBreakMode:UILineBreakModeWordWrap];
[cell.exsInfoLabel setFrame:CGRectMake(CELL_CONTENT_MARGIN, top, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), size.height)];
[cell.exsInfoLabel setText:spName];
[spName release];
Run Code Online (Sandbox Code Playgroud)
arrEx由两个项组成,所以它应该是两个字符串.但是UITableViewCell只包含第一个字符串.在IB中,我将UILabel的行数设置为0 cell.exsInfoLabel.
ios ×6
autolayout ×3
uilabel ×3
uitableview ×3
uikit ×2
cocoa-touch ×1
ios7 ×1
swift ×1
uistoryboard ×1
xcode6 ×1