模糊的UILabel作为UITableViewCell contentView的程序化子视图

时间:2010-01-12 07:01:39

标签: iphone uiview uitableview colors uilabel

我正在添加UILabel个实例作为我的自定义UITableViewCell实例contentView的子视图。

当我选择单元格时,除了标签的背景外,该行突出显示为蓝色。标签文字很清晰。

当我将标签和内容视图backgroundColor属性设置为[UIColor clearColor]时,标签文字会变得模糊。

如何将标签背景颜色设置为清晰,以允许行高亮显示,同时仍保持标签文字清晰?

我在其他地方读到的一条建议是round标签的frame值,但这没有任何效果。

CODE

以下是我的自定义UITableViewCell子视图-setNeedsLayout方法的摘要:

UILabel *_objectTitleLabel = [[UILabel alloc] initWithFrame:CGRectNull];
_objectTitleLabel.text = [self.awsObject cleanedKey];
_objectTitleLabel.font = [UIAppDelegate defaultObjectLabelFont];
_objectTitleLabel.highlightedTextColor = [UIColor clearColor]; //[UIAppDelegate defaultLabelShadowTint];
_objectTitleLabel.backgroundColor = [UIColor clearColor]; //[UIAppDelegate defaultWidgetBackgroundTint];
_objectTitleLabel.frame = CGRectMake(
        kCellImageViewWidth + 2.0 * self.indentationWidth,
        0.5 * (self.tableView.rowHeight - 1.5 * kCellLabelHeight) + kCellTitleYPositionNudge,
        contentViewWidth,
        kCellLabelHeight
);
_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame);
_objectTitleLabel.tag = kObjectTableViewCellTitleSubviewType;
//NSLog(@"_objectTitleLabel: %@", NSStringFromCGRect(_objectTitleLabel.frame));
[self.contentView addSubview:_objectTitleLabel];
[_objectTitleLabel release], _objectTitleLabel = nil;

...

self.contentView.backgroundColor = [UIAppDelegate defaultWidgetBackgroundTint]; 
self.contentView.clearsContextBeforeDrawing = YES;
self.contentView.autoresizesSubviews = YES;
self.contentView.clipsToBounds = YES;
self.contentView.contentMode = UIViewContentModeRedraw;

9 个答案:

答案 0 :(得分:35)

问题是子像素渲染,当您的原点(浮点值)具有非零小数分量时会发生这种情况。舍入到最接近的整数,你应该没事。

答案 1 :(得分:9)

就我而言,在包含UILabel的视图的CGLayer上设置shouldRasterize = YES是罪魁祸首。删除该行使文本更好,更清晰。

答案 2 :(得分:7)

确定发现了问题,确保父视图的坐标也是圆整的。

答案 3 :(得分:2)

我今天自己遇到了这个问题,并在某处读到UILabel框架的原点和大小的非整数值可能导致这种情况(我知道它们是浮动的,但你知道我的意思)。必须有一个更优雅的解决方案,但这个快速的黑客似乎已经解决了我的问题:

self.valueLabel.frame = CGRectMake((int) frame.origin.x, (int) frame.origin.y, (int) frame.size.width, (int) frame.size.height);

如果你找到了更好的解决方案,请告诉我,我很想用更有品味的东西取代这个黑客。

答案 4 :(得分:2)

乱码/模糊文本的另一个原因是单元重用。如果您要对可重复使用的单元格进行排队,那么它可能会在其他位置重新绘制不同的维度,并在使用乱码文本到达您的单元格时再次使用。

要确保单元格是唯一的,请确保为文本乱码的标记分配新单元格,并使用不同的重用标识符标记该UITableViewCell实例。当然,如果您处理的是非常少量的细胞,并且您确切知道哪些细胞会导致问题,那么这只是实用的。

答案 5 :(得分:2)

shouldRasterize设置为YES可能会带来模糊性。设置光栅化比例,这应该消除模糊。 [self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];

答案 6 :(得分:1)

有时,您提到的模糊性的原因可能是标签的框架超出了单元格框架。 即使您看到所有文本都放在单元格的标签内,实际标签尺寸也可能比单元格框架大。

要检查这是否是影响的原因,您会看到我建议在实例化后检查/打印有关标签大小/位置的所有数据,然后检查委托方法tableView:heightForRowAtIndexPath:这个适合进入细胞高度,返回细胞。 希望它对你的情况有所帮助。

答案 7 :(得分:1)

使用round();提供C函数是有原因的。

#define roundCGRectValues (frame) \
frame = CGRectMake(round(frame.origin.x),round(frame.origin.y),round(frame.size.width),round(frame.size.height));

所有你需要的。

答案 8 :(得分:1)

即使出列的可重复使用的单元格,-setNeedsLayout是否会被调用?如果是这样,单元格已经将标签添加到内容视图中,您将绘制两次,使其模糊。在添加子视图之前,您可以通过删除所有内容视图的子视图来低效地解决此问题:

for (UIView *subview in [[self contentView] subviews]) {
     [subview removeFromSuperview];
}

更好的解决方案是在您的单元子类上提供属性,以便您根据需要修改重用单元格的内容,而不是从头开始重建其视图层次结构。

相关问题