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

时间:2010-05-11 14:38:50

标签: iphone cocoa-touch uiview uitableview

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

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

BEFORE&& AFTER

alt text http://new.tinygrab.com/c1f9e8196b4b92e6bb4d3130a7e08974.png alt text http://new.tinygrab.com/531ee83e42cdeadc78d418d1c5e7c513.png

我有很多代码,most of which is written up here。我已尽力调整我的能力,查看适用更改的文档,但在至少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];
    }
}

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

更新2:

我创建了一个simple sample application来突出显示问题。

3 个答案:

答案 0 :(得分:5)

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

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

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

为了摆脱黑角你可以:

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

希望它有所帮助。

<强>更新

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

我已经重新阅读了单元格图层的代码,并找到了一种以简单方式移除黑角的方法。基本思想是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方法,因为不再需要它。

答案 1 :(得分:2)

我在模拟器上使用OS3.2对您的示例代码进行了实验,它肯定会显示相同的症状。我尝试了一些事情并最终解决了这个问题:

self.cornerRadius = 12;

使用UAGradientCellBackgroundLayer方法将其添加到init

答案 2 :(得分:0)

把它扔出去(也许会有所帮助),将以下内容添加到cellForRowAtIndexPath会产生一个有趣的效果:

cell.backgroundView.alpha = 0.4;
cell.selectedBackgroundView.alpha = 0.4;

并非所有细胞都具有黑色背景。改变alpha似乎改变了任何给定单元格不正确渲染的概率。 alpha = 1.0保证黑色背景,而任何较低的降低了这种效果的概率。

黑色背景也会消失,所以我相信你们都知道,但是,它与UAGradientCellBackgroundView有关。

祝你好运!