我不是图形专家,但是我通过使用一些CG代码将背景 View 设置为backgroundView,设法设法制作了一些美观的自定义分组的UITableViewCells。在所有SDK直至3.1.3(可能是3.2 ...我还没有在iPad上测试过)的情况下,它都可以很好地工作,但是我认为较新的SDK引入了一种更改屏幕外缓存图形方式的方法。
第一次渲染时,一切都很棒:绘图很好,拐角也透明。如果我将几个 View Controller 推到导航堆栈上并返回,则 View 中现在会出现黑角:
之前&&之后
iphone - 仅在导航弹出后,分组的UITableViewCells上才会出现黑角-LMLPHP
(来源:tinygrab.com)
iphone - 仅在导航弹出后,分组的UITableViewCells上才会出现黑角-LMLPHP
(来源:tinygrab.com)
我有大量的代码most of which is written up here。我已尽力进行调整,查看文档中是否有适用的更改,但是至少经过8个小时之后,我仍然找不到可能导致此问题的原因。我尝试过将所有我认为可以使用的 View 设置为backgroundColor=clearColoropaque=NO,但我还缺少什么?有调试提示吗?
更新:
我在viewDidAppear中有一些调试代码,可打印所有 subview 的backgroundColor和类描述。

- (void)debugView:(UIView *)view {
    DebugLog(@"%@ - %@", view.backgroundColor, [[view class] description]);
    for (UIView* child in view.subviews) {
        [self debugView:child];
    }
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [DownloadController.networkQueue setSuspended:NO];
    for (TTTableViewCell *cell in [self.tableView visibleCells]) {
        [cell debugView:cell];
    }
}
通过此代码,我会在第一次加载时检查单元格 View 的backgroundColor设置(正常时),然后在返回后再次检查。有一些区别,但是所有颜色仍设置为清晰。这使我相信问题出在UITableViewCell之下。
更新2:
我创建了一个simple sample application来突出问题。

最佳答案

我已经测试了示例应用程序,并且可以重现黑角问题。

经过一些实验,似乎黑角问题与用于渲染表格 View 的图层的缓存有关。单元层的几何形状似乎很重要:

  • 在第一个绘画上,要求将单元绘画成一个矩形。您的代码绘制了一条圆角的路径,但剪掉了所有的角落。由于已经绘制了基本的tableview,所以不会发生任何问题。 rect区域被缓存,其角未绘制(paint)。
  • 按下 Controller 后,将存储一个缓存的图像,其中包含用于单元格的矩形占位符。
  • 弹出 Controller 时,将绘制缓存的图像和单元格。但是绘制单元格的位置是矩形,但单元格的缓存图像却不是,导致出现黑角。

  • 为了摆脱黑角,您可以:
  • 确保已绘制所有单元格的rect。这意味着在绘制边缘之前,使用相同的颜色将单元格归档为表格 View 的背景色。如果您的表格 View 使用默认的背景色,则可以使用[UIColor groupTableViewBackgroundColor].CGColor作为填充色;它是一种基于图案的颜色,并且遵循设备方向(是);但是绘画与背景并没有完全对齐(该死)。
  • 在单元的图层上使用CALayer蒙版。这意味着创建一个 mask CGImage,将其设置为图层的内容,并将 mask 层分配给单元的图层。不确定性能。

  • 希望能有所帮助。

    更新

    经过一些失败的尝试后,我放弃了面具的想法,因为它太笨拙了。

    我已经重新阅读了单元格层的代码,并找到了一种简单的方法来消除黑角。基本思想是CAGradientLayer仅在其渐变颜色清晰的情况下才是完全透明的。通过使用以下display方法,黑角消失了(在模拟器和设备上):
    - (void)display {
        if (_override) {
            self.colors =
            [NSArray arrayWithObjects:
             (id)[UIColor colorWithRed:colorComponents[0] green:colorComponents[1] blue:colorComponents[2] alpha:colorComponents[3]].CGColor,
             (id)[UIColor colorWithRed:colorComponents[4] green:colorComponents[5] blue:colorComponents[6] alpha:colorComponents[7]].CGColor,
             nil];
        } else {
            self.colors =
            [NSArray arrayWithObjects:
             (id)[UIColor clearColor].CGColor,
             (id)[UIColor clearColor].CGColor,
             nil];
        }
        [super display];
    }
    

    当然,可以对此进行一些优化:
  • 创建一次颜色数组。
  • override属性提供自定义 setter ,以更改图层的颜色。
  • 不再需要display方法,请删除它。
  • 关于iphone - 仅在导航弹出后,分组的UITableViewCells上才会出现黑角,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2811611/

    10-14 20:26
    查看更多