20

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

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

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

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

我在别处读到的一个建议是针对round标签的frame值,但这没有任何效果。

代码

这是我的自定义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;
4

9 回答 9

35

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

于 2010-01-23T00:17:55.000 回答
9

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

于 2013-05-14T12:52:28.843 回答
7

好的,找到了问题,确保你的父视图的坐标也是四舍五入的。

于 2010-03-29T11:49:05.743 回答
2

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

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

如果您找到更好的解决方案,请告诉我,我很乐意用更有品味的东西来替换这个 hack。

于 2010-01-22T09:58:08.033 回答
2

乱码/模糊文本的另一个原因是单元格重用。如果您将可重复使用的单元格出队,那么它可能会在其他地方以不同的尺寸重绘,并在到达带有乱码文本的单元格时再次被重新使用。

为确保单元格是唯一的,请务必为文本乱码的索引分配一个新单元格,并使用不同的重用标识符标记该 UITableViewCell 实例。当然,这只有在您处理非常少量的单元格并且您确切知道哪些单元格导致问题时才实用。

于 2010-09-17T20:24:23.847 回答
2

设置shouldRasterizeYES可能会引入模糊。设置光栅化比例,这应该可以消除模糊。[self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];

于 2013-09-06T15:25:59.990 回答
1

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

要检查这是否是您看到的效果的原因,我建议在实例化后检查/打印有关标签大小/位置的所有数据,然后检查委托方法 tableView:heightForRowAtIndexPath: 这是否适合单元格您为单元格返回的高度。希望它对您的情况有所帮助。

于 2010-01-22T11:12:46.900 回答
1

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

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

一切你需要的。

于 2010-05-30T18:45:13.160 回答
1

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

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

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

于 2010-08-21T23:12:54.900 回答