使用 NSAttributedString iOS 自定义 heightForRowAtIndexPath (CGSize sizeWithFont)
Posted
技术标签:
【中文标题】使用 NSAttributedString iOS 自定义 heightForRowAtIndexPath (CGSize sizeWithFont)【英文标题】:Custom heightForRowAtIndexPath (CGSize sizeWithFont) with NSAttributedString iOS 【发布时间】:2012-11-05 11:01:20 【问题描述】:我有一个表格视图,其中我的单元格高度是根据它所代表的文本动态定义的。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
//getting my text for this cell, the row etc ...
...
//here is the part interesting us
NSAttributedString* theText = [myTextForThisCell objectAtIndex:indexPath.row];
NSInteger labelWidth = self.tableView.bounds.size.width-HORIZONTAL_CELL_PADDING;
CGSize textSize = [theText sizeWithFont:[UIFont systemFontOfSize:customFontSize] constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
return textSize.height+VERTICAL_CELL_PADDING;
好的,现在我的问题。 tableview 是搜索操作的结果,它在扫描 plist 文件后显示包含给定字符串的行。
到现在为止就是这样。但是现在有了 ios 6 和 NSAttributedString 可以轻松地将部分字符串加粗,我决定将搜索词加粗。
它正在工作,它加粗了我想要的单词,但现在我不再能够计算单元格高度,因为 sizeWithFont 要求一个 NSString。而且由于粗体需要更宽的宽度,我不能简单地用没有属性的字符串计算单元格高度。
我只是卡在这里。
谁能帮帮我?
【问题讨论】:
【参考方案1】:事实上,我只需要阅读 NSAttributedText 的苹果文档。
就我而言,我必须将最后两行代码替换为
CGRect rectSize = [theText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin context:NULL];
return rectSize.size.height+VERTICAL_CELL_PADDING;
跟进 iOS 7
我一直在努力在 iOS7 中使用属性文本进行这项工作。
苹果文档说
在 iOS 7 及更高版本中,此方法返回小数大小(在大小 返回的 CGRect 的组成部分);使用返回的大小来调整大小 视图,您必须使用将其值提高到最接近的更高整数 使用 ceil 函数。
哪种方式显然不适合我!对我来说,解决方案是将 +1 添加到高度的上限。这可能是 Apple 的错误,但对我来说,现在一切都在 iOS6 中运行。
CGRect rectSize = [theAttributedText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin context:NULL];
return ceil(rectSize.size.height) + 1 + VERTICAL_CELL_PADDING;
【讨论】:
是的,当然,NSAttributedText 在 iOS6 之前是不可用的 非常感谢。你的回答对我帮助很大! 同上,有没有人发现这个方法为什么会误算1个像素? 这个方法只返回标签中文本的大小,但是这个方法需要你返回单元格的大小。单元格内容是标签 + 单元格分隔符(即 1px)。确保为总单元格大小添加此单元格分隔符高度。以上是关于使用 NSAttributedString iOS 自定义 heightForRowAtIndexPath (CGSize sizeWithFont)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Xcode 10.3 构建时,NSAttributedString 在 iOS 13 上不可见
使用 Swift 在 iOS 11 中为 NSAttributedString 添加删除线
UIButton 上的 iOS NSAttributedString
使用 NSAttributedString iOS 自定义 heightForRowAtIndexPath (CGSize sizeWithFont)