导航弹出后,仅在分组的UITableViewCells上出现黑角

con*_*are 8 iphone cocoa-touch uitableview uiview

我不是图形专家,但我通过将背景视图设置为带有一些CG代码的backgroundView,以某种方式设法制作了一些外观漂亮的自定义UITableViewCells.在所有SDK中高达3.1.3(可能是3.2 ......我还没有在iPad上测试过)这很好用,但我认为更新的SDK已经引入了图形缓存在屏幕外的方式的变化.

在第一次渲染时,一切都很棒:绘图很好,角落是透明的.如果我在导航堆栈上按下几个视图控制器并返回,则视图中现在出现黑角:

之前&&之后

alt text http://new.tinygrab.com/c1f9e8196b4b92e6bb4d3130a7e08974.png     替代文字http://new.tinygrab.com/531ee83e42cdeadc78d418d1c5e7c513.png

我有很多代码,其中大部分是在这里写的.我已尽力调整我的能力,查看适用更改的文档,但在至少8小时之后我仍然无法找到可能导致此问题的原因.我已经尝试设置每一个观点我能想到的是backgroundColor=clearColoropaque=NO我失去了还有什么?任何调试技巧?

更新:

我有一些调试代码,viewDidAppear用于打印所有子视图的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];
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我会在第一次加载时检查单元格视图的backgroundColor设置,当它正常时,然后在返回后再次检查.虽然存在一些差异,但所有颜色仍然很清晰.这让我相信UITableViewCell下面的问题.

更新2:

我创建了一个简单的示例应用程序来突出显示问题.

Lau*_*ble 5

我测试了样本应用程序,可以重现黑角问题.

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

  • 在第一个油漆上,要求将单元涂成矩形.您的代码正在绘制圆形路径,但剪切了角落.由于已经绘制了基础表视图,因此不会出现问题.默认区域是高速缓存,其角落未上漆.
  • 按下控制器时,将存储缓存的图像,其中包含单元格的矩形占位符.
  • 弹出控制器时,将绘制缓存的图像和单元格.但绘制单元格的位置是矩形的,但单元格的缓存图像不是,导致黑角.

为了摆脱黑角你可以:

  • 确保绘制了所有单元格的矩形.这意味着在绘制边缘之前使用相同的颜色来存档单元格作为tableview的背景颜色.如果您的tableview使用默认背景颜色,您可以使用[UIColor groupTableViewBackgroundColor].CGColor填充颜​​色; 它是基于图案的颜色,遵循设备方向(是的); 但这幅画与背景并不完全一致(该死的).
  • 在单元格图层上使用CALayer蒙版.这意味着创建一个遮罩CGImage,将其设置为图层的内容,并将遮罩层指定给单元格的图层.不确定性能.

希望它有所帮助.

更新

经过一些不成功的尝试后,我放弃了面具的想法,因为它太笨拙了.

我已经重新阅读了单元格层的代码,并找到了一种以简单的方式去除黑角的方法.基本思想是,CAGradientLayer只有当渐变颜色清晰时,a 才是完全透明的.通过使用以下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];
}
Run Code Online (Sandbox Code Playgroud)

当然,这可以稍微优化一下:

  • 创建一次颜色数组.
  • 提供用于override更改图层颜色的属性的自定义setter .
  • 删除display不再需要的方法.