我正在添加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;
答案 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];
}
更好的解决方案是在您的单元子类上提供属性,以便您根据需要修改重用单元格的内容,而不是从头开始重建其视图层次结构。