每个单元格添加cornerRadius的UILabel后,UITableView变得缓慢

8

我正在为我的表视图中的每个单元格添加一个UILabel。最初这没有任何问题。但是,当我使用 layer.cornerRadius 圆角化UILabel时,滚动表视图会变得很慢。

 UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(cell.bounds.origin.x+10 ,5, 30, 30)];
 label1.backgroundColor = ([[managedObject valueForKey:@"color"] hasPrefix:@"FFFFFF"]) ? [UIColor blackColor] : color;
 label1.layer.cornerRadius = 10.0f;
 [cell addSubview:label1];

你可能想看一下Tweetie是如何实现的(平滑滚动)。 - icktoofay
3个回答

15

不需要一个带有圆角的图片-请参考fknrdcls在此问题上的答案:

UILabel layer cornerRadius negatively impacting performance

基本上,您只需要给标签一个透明的背景,并将背景颜色添加到图层中。然后,您可以禁用maskToBounds,这大大提高了性能。所以您的代码变成了:

UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(cell.bounds.origin.x+10 ,5, 30, 30)];
label1.backgroundColor = [UIColor clearColor];
label1.layer.backgroundColor=[UIColor whiteColor].CGColor;
label1.layer.cornerRadius = 10.0f;
label1.layer.masksToBounds = NO;
label1.layer.shouldRasterize = YES;

+1 我非常喜欢这个解决方案,但我只需要将一些角落变圆。我的解决方法是:为了仅显示顶部和底部的右侧圆角,我添加了一个子视图,并在其frame.origin.x上赋负值,然后将cornerRadius分配给其layer。如果有人发现更好的解决方案,我很感兴趣。 - anneblue

7

我之前也尝试过这种方法,但发现对于任何移动的视图都是无用的。相反,你应该创建一个带有圆角的图片,并将其作为标签的背景添加。


这并不是一个很好的解决方案,因为在不同大小的标签上,图像将被拉伸,并且由图像给出的圆角将与其他标签不同。 - Silviu St

0

对于UIImageView,UILabel的技巧不起作用,因为我不仅需要裁剪图像,还需要裁剪背景颜色。我找到的最快解决方案是在动画时栅格化视图的父级(我有一个滑动面板)。


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