0

我的要求是部分文本应该在 UITableview 的每个单元格中显示为粗体和彩色。我使用 NSMutableAttributedString、CATextLayer 和单元格的 contenview 层对其进行了管理。下面是我用来显示的代码。

 CATextLayer *textLayer = nil;   //used to draw the attributed string
 CALayer *layer = nil; 
    if(cell == nil) {
                 textLayer = [[CATextLayer alloc] init];
                textLayer.backgroundColor = [UIColor clearColor].CGColor;
                [textLayer setForegroundColor:[[UIColor clearColor] CGColor]];
                [textLayer setContentsScale:[[UIScreen mainScreen] scale]];
                textLayer.wrapped = YES;
                layer = cell.contentView.layer;
                [layer addSublayer:textLayer];
                textLayer = nil;
    }
//get the layer by nesting sublayer of cell layer because we don't have tag property for the layer and textlayer.


if (!layer) {
       layer = cell.contentView.layer;
   }



for (id subLayer in layer.sublayers) {
            if ([subLayer isKindOfClass:[CATextLayer class]]) {
                // NSLog(@"found textlayer");
                textLayer = subLayer;
                textLayer.string = nil;
            }
        }
textLayer.frame = CGRectMake(53.0f, 23.0f, 240.0f, attributedStrHeight);

        if([self isNotNull:mAttrbtdStr]) {
            textLayer.string = mAttrbtdStr;
        }

问题是当我快速滚动表格时,文本显示为动画(重叠),并且在停止滚动后显示正确。请找到下面的参考图片

表快速滚动时重叠 AttributedString

任何人都可以帮助我为什么只有当我滚动表格时才会发生这种重叠?

4

1 回答 1

1

这确实是一个有趣的问题,CALayer属性是默认动画的(隐式动画),所以它可能是CATextLayer滚动视图动画内部的默认行为。一种解决方案可能是禁用它们,您有两种选择:

  1. 在当前事务中禁用动画,但即使您正在创建新事务,我也不会对 tableview 上的正常动画产生影响

    [CATransaction begin];

    [CATransaction setValue: [NSNumber numberWithBool: YES] forKey: kCATransactionDisableActions];

    [CATransaction commit];

  2. 将动画动作字典设置为 return null,这里有一个帮助Disabling implicit animations in -[CALayer setNeedsDisplayInRect:]

于 2012-06-18T13:35:02.057 回答