【问题标题】:Blurry UILabel as programmatic subview of UITableViewCell contentView模糊 UILabel 作为 UITableViewCell contentView 的编程子视图
【发布时间】:2011-01-04 01:46:47
【问题描述】:

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

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

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

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

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

代码

这是我自定义的UITableViewCell 子视图的-setNeedsLayout 方法的sn-p:

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;

【问题讨论】:

  • 你能发布你的源代码吗?
  • 请查看添加的代码sn-p。

标签: iphone uiview uitableview colors uilabel


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 正确。但如果您使用UITableViewCell,这可能会在滚动中引入抖动。在这种情况下,设置光栅化比例。
    • 这是个好建议。我最终在我的 tableview 单元格中使用 Quartz 完成了完整的自定义绘图,现在它快如闪电了!
    • 它可以工作,但是当我滚动时它会变得滞后
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          所有你需要的。

          【讨论】:

          • 如前所述,我添加了_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame); 无效。
          【解决方案7】:

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

          【讨论】:

          • 我已经将框架设置为整数值:_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame)
          • 您仍然看到渲染模糊的问题?你的父视图呢?它们的位置是否过于完整?
          • 警告:在设置奇数宽度和/或高度的视图的center 时也会出现此问题。
          • 这个答案应该标记为这个问题的正确答案,设置中心是导致这个问题的好方法。
          • #define CGPointIntegral(point) CGPointMake((int)point.x,(int)point.y) 是将 CGPoint 成员转换为整数的快速宏。
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

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

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

            【讨论】:

            • 我已经将框架设置为整数值:_objectTitleLabel.frame = CGRectIntegral(_objectTitleLabel.frame)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-10-06
            • 1970-01-01
            • 2012-10-07
            • 2011-09-14
            • 1970-01-01
            • 2019-12-28
            • 1970-01-01
            相关资源
            最近更新 更多