sizeToFit 不会触发带有长字的新行

Posted

技术标签:

【中文标题】sizeToFit 不会触发带有长字的新行【英文标题】:sizeToFit doesn't trigger new line with long words 【发布时间】:2012-05-09 05:25:28 【问题描述】:

我刚刚遇到了一个奇怪的问题,我有一个具有动态高度的自定义 tableview 单元格。 虽然测试这一切似乎工作正常,但现在我正在将真实内容加载到其中似乎存在一些问题。

似乎某些文本不会触发 UILabel 中的新行

正确:http://dl.dropbox.com/u/274185/Screen%20Shot%202012-05-09%20at%201.15.21%20PM.png 错误:http://dl.dropbox.com/u/274185/Screen%20Shot%202012-05-09%20at%201.15.30%20PM.png

在错误的例子中你可以看到,文本被推到了第二行,但标签的高度仍然只计算一行。

item.project = @"Another Test Project With Long Title (Admin / Project Management)";

item.project = @"测试项目(管理员/项目管理)";

我计算高度的方式是这样的:

// when creating the cell
cell.projectLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.projectLabel.numberOfLines = 0;
[cell.projectLabel sizeToFit];

// in heightForRowAtIndexPath()
CGSize projectHeight = [item.project sizeWithFont:[UIFont boldSystemFontOfSize:13.0f] constrainedToSize:CGSizeMake(320.0f, CGFLOAT_MAX) lineBreakMode: UILineBreakModeWordWrap];

我尝试更改 lineBreakMode,但这似乎没有多大帮助

编辑: 计算文本高度时似乎有问题,我使用了固定的320点,这是不正确的,使用实际宽度后高度计算正确。

CGSize projectHeight = [item.project sizeWithFont:[UIFont boldSystemFontOfSize:13.0f] constrainedToSize:CGSizeMake(cell.projectLabel.bounds.size.width, CGFLOAT_MAX) lineBreakMode: UILineBreakModeWordWrap];

【问题讨论】:

【参考方案1】:

相信 sizeToFit 只会缩小视图的大小。 您应该将标签的框架设置为足够高以容纳两行,然后调用 sizeToFit。这将在文本只有一行时缩小标签,但在文本为两行时保持其高度。

【讨论】:

在 Interface Builder 中,我的标签框架足够高,可以容纳多行。但正如你从截图中看到的那样,它只在某些情况下发生,这让我认为它与 lineBreakMode 有关系 测试UILineBreakModeCharacterWrap 看看是否属实 同样的问题,当我输出高度时,第一个高度为 32px,另一个只给出 16px。奇怪... 是标签的高度还是行的高度?与标签的高度相比,行的高度是多少? 行高是动态的,比如上一张截图的那一行,行131px,标签16px,第一张截图行189px,标签32px

以上是关于sizeToFit 不会触发带有长字的新行的主要内容,如果未能解决你的问题,请参考以下文章

计算机中位字长字的区别

是否可以在 Access 中执行触发器,在 SqlServer 数据库的表中插入新行?

在 phpmyadmin 上插入触发器

带有按钮 addTarget 事件的标签不会触发

使用带有 MVC4 SQL Server 的实体框架插入后触发器不会触发

插入新行时在谷歌电子表格上触发脚本