5

我无法使用 NSAttributedStrings 从 UITableViewCell 中的 UITextViews 获得一致的结果。

内部 - (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);

不提供任何一致的结果:

在此处输入图像描述

并在使用 contentinset 集滚动后: 在此处输入图像描述

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

4

1 回答 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 为您提供了测量尺寸并在该尺寸内绘制所需的所有功能。

于 2013-03-02T03:49:00.020 回答