1

我有一个修改后的 UIView,用于显示富文本 (NSAttributedString)。我正在将 UIView 添加到我的 UITableViewCell 并且正在执行 drawRect。我重写了该方法以显示文本。

问题是在第 3 行它写了我想要的文本,但在它下面的旧文本仍然存在。

所有其他细胞也是如此。

如何清除每个单元格的 UIView?

这是我的drawrect

- (void)drawRect:(CGRect)rect
{
   [super drawRect:rect];
   CGContextRef context = UIGraphicsGetCurrentContext();
   CGContextClearRect(context, self.bounds);
   CGContextSetTextMatrix(context, CGAffineTransformIdentity);
   CGContextTranslateCTM(context, 0, self.bounds.size.height);
   CGContextScaleCTM(context, 1.0, -1.0);

   CGMutablePathRef path = CGPathCreateMutable(); //1
   CGPathAddRect(path, NULL, self.bounds );

   CTFramesetterRef framesetter =
   CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)self.attString); 

   CTFrameRef frame =

   CTFramesetterCreateFrame(framesetter,

                         CFRangeMake(0, [self.attString length]), path, NULL);

   CTFrameDraw(frame, context); //4
   CFRelease(frame); //5
   CFRelease(path);
   CFRelease(framesetter);

}

这是我在 cellforrowatindexpath 中添加它的方式:

 NSAttributedString* attrString = [p attrStringFromMarkup:[NSString stringWithFormat:@"%@%@ %@%@ %@%@", @"<font color=\"black\">", userName, @"<font color=\"gray\">",actionType,  @"<font color=\"black\">", object]];
CGRect rect = CGRectMake(0, 0, 249, 50);
CTView *aView = [[CTView alloc]initWithFrame:rect];
[aView setBackgroundColor:[UIColor clearColor]];
[(CTView*)aView setAttString: attrString];
[cell.feedView addSubview:aView];
4

1 回答 1

2

您应该在创建 UITableViewCell 后只创建一次 CTView,然后将其与单元格一起使用。否则,您将多次将 CTView 添加到同一个单元格。

代码应如下所示:

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

   CGRect rect = CGRectMake(0, 0, 249, 50);
   CTView *aView = [[CTView alloc]initWithFrame:rect];
   [aView setBackgroundColor:[UIColor clearColor]];
   [aView setTag:kCTViewTag];
   [cell.feedView addSubview:aView];
}

// Configure the cell...
 NSAttributedString* attrString = [p attrStringFromMarkup:[NSString stringWithFormat:@"%@%@ %@%@ %@%@", @"<font color=\"black\">", userName, @"<font color=\"gray\">",actionType,  @"<font color=\"black\">", object]];

CTView* view = (CTView*)[cell viewWithTag:kCTViewTag];
[view setAttString:attrString];

setAttString方法应该调用[self setNeedsDisplay].

于 2012-11-02T22:46:55.767 回答