如何在UITableViewCell中的UITextView中一致地绘制NSAttributedString?

5

我在使用NSAttributedStrings在UITableViewCell中的UITextView上获取一致的结果方面遇到了困难。

在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath: 方法中:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    headerText = [[UITextView alloc]initWithFrame:CGRectZero];
    [headerText setUserInteractionEnabled:NO];
    headerText.tag = HEADER_TEXT;
    [cell.contentView addSubview:headerText]; 
} else {
    headerText = (UITextView*)[cell.contentView viewWithTag:HEADER_TEXT];
}

//...setting up attributed strings


[headerText setAttributedText:headerString];

CGSize headerSize = [headerText sizeThatFits:CGSizeMake(246, CGFLOAT_MAX)];

headerText.frame = CGRectMake(45, 8, headerSize.width, headerSize.height);

结果:

不滚动时的内容

可以看到,前两个似乎以我期望/想要的方式绘制了文本。而在后面两个中,UITextView的sizeThatFits方法返回的大小比绘制文本所需的大小要大得多,并且文本变为居中对齐,而不是紧贴框架顶部。这是一个问题,因为我希望能够根据uitextview框架高度布局其他视图。

滚动出框架并再次滚回来时: 在此输入图片描述

现在更奇怪的是,当单元格被重用并且属性字符串被重新设置时,UITextView以不一致的方式绘制文本。

即使将contentInsets设置为

headerText.contentInset = UIEdgeInsetsMake(-8, -8, -8, -8);

不能提供任何一致的结果:

enter image description here

设置contentinset后进行滚动后: enter image description here

UITextView上是否还有其他属性可以让我获得所需的行为?

1个回答

8

当设置一个UITextView的属性字符串时,如果之前有不同的属性字符串,你必须首先将该UITextView的所有与字符串相关的属性设为nil,例如:

self.tv.text = nil;
self.tv.font = nil;
self.tv.textColor = nil;
self.tv.textAlignment = NSTextAlignmentLeft;
self.tv.attributedText = s2;

否则,就像你所发现的那样,之前属性字符串的旧特性仍然存在并影响新的属性字符串。
总的来说,我必须说我不明白你为什么要使用UITextView。如果你不需要用户能够编辑这些属性字符串,使用UILabel或直接绘制属性字符串以获得最准确的渲染效果。NSAttributedString为你提供了所有必要的功能,可以测量大小并在该大小范围内进行绘制。

我正在使用UITextView,因为它实现了UITextInput协议。这使我能够在某些文本子字符串上创建按钮。我承认直接绘制文本会更好。我应该深入哪些iOS库以实现这一点?再次感谢回答这个问题。 - Piotr Tomasik
绘制文本不需要任何“库”。它是UIKit的一部分。 - matt
我认为我可能需要使用CoreText来确定触摸是否发生在给定行或文本运行的顶部。 - Piotr Tomasik
终于找到了!谢谢!! - Povilas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接