Iphone 仅在导航弹出后,分组UITableViewCells上的黑色角
我不是一个图形专家,但我通过一些CG代码将背景视图设置为背景视图,设法制作了一些好看的自定义分组UITableViewCells。在3.1.3之前的所有SDK中(可能是3.2…我还没有在iPad上测试过),这一切都很好,但我认为最近的SDK在屏幕外缓存图形的方式上引入了变化 在第一次渲染时,一切都很好:绘图很好,角是透明的。如果我按下导航堆栈上的两个视图控制器并返回,现在视图中会出现黑色的角点: 前后Iphone 仅在导航弹出后,分组UITableViewCells上的黑色角,iphone,cocoa-touch,uiview,uitableview,Iphone,Cocoa Touch,Uiview,Uitableview,我不是一个图形专家,但我通过一些CG代码将背景视图设置为背景视图,设法制作了一些好看的自定义分组UITableViewCells。在3.1.3之前的所有SDK中(可能是3.2…我还没有在iPad上测试过),这一切都很好,但我认为最近的SDK在屏幕外缓存图形的方式上引入了变化 在第一次渲染时,一切都很好:绘图很好,角是透明的。如果我按下导航堆栈上的两个视图控制器并返回,现在视图中会出现黑色的角点: 前后 (来源:) (来源:) 我有大量的代码。我已经尽我最大的努力调整,查看文档中适用的更改,但
(来源:)
(来源:) 我有大量的代码。我已经尽我最大的努力调整,查看文档中适用的更改,但在至少8小时之后,我仍然找不到可能导致这种情况的原因。我试着将我能想到的每个视图都设置为
backgroundColor=clearColor
和obaque=NO
我还缺少什么?有调试技巧吗
更新:
我在viewdideappear
中有一些调试代码,用于打印所有子视图的背景色和类描述
- (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];
}
}
有了这段代码,我在第一次加载时检查单元视图的背景颜色设置,当它正常时,然后在返回后再次检查。虽然存在一些差异,但所有颜色仍设置为清晰。这让我相信问题就在UITableViewCell下面
更新2:
我创建了一个示例来强调这个问题。我在模拟器上使用OS3.2对您的示例代码进行了实验,它肯定显示了相同的症状。我尝试了一些方法,最终得到了以下修复:
self.cornerRadius = 12;
将其添加到
UAGradientCellBackgroundLayer
中的init
方法中。我已经测试了示例应用程序,可以重现黑角问题
经过一些实验,似乎黑角问题与用于渲染表视图的层的缓存有关。细胞层的几何结构似乎很重要:
- 在第一次绘制时,要求将单元格绘制为矩形。您的代码正在绘制一条圆形的路径,但删除了拐角。由于已经绘制了基础tableview,因此不会出现任何问题。矩形区域被缓存,其角点未上漆
- 推送控制器时,将存储一个缓存的图像,其中包含单元格的矩形占位符
- 弹出控制器时,将绘制缓存的图像和单元格。但是绘制单元格的位置是矩形的,但是单元格的缓存图像不是矩形的,这导致了黑色的角
- 确保所有单元格的矩形都已绘制。这意味着在绘制作为tableview背景色的边之前,使用相同的颜色来归档单元格。如果tableview使用默认背景色,则可以使用
作为填充色;它是一种基于图案的颜色,并遵循设备方向(是的);但是这幅画与背景并不完全一致(该死)[UIColor groupTableViewBackgroundColor].CGColor
- 在单元层上使用CALayer遮罩。这意味着创建一个遮罩
,将其设置为层的内容,并将遮罩层指定给单元的层。我对表演不太确定CGImage
CAGradientLayer
才是完全透明的。通过使用以下显示
方法,黑角消失(在模拟器和设备上):
当然,这可以稍微优化一下:
- 创建颜色数组一次
- 为更改图层颜色的
属性提供自定义设置器覆盖
- 删除
方法,因为不再需要它display
cell.backgroundView.alpha = 0.4;
cell.selectedBackgroundView.alpha = 0.4;
并非所有单元格都有黑色背景。更改alpha似乎会更改任何给定单元不正确渲染的概率。alpha=1.0可保证黑色背景,而任何较低的值都会降低这种效果的可能性
黑色背景也会褪色,所以我相信你们都知道,但是的,这与UAGradientCellBackgroundView有关
祝你好运 这很奇怪,在我脑海中我会说,也许当细胞被重用时,会发生一些事情,去掉细胞重用代码,看看这是否有帮助。只是一个想法,好主意。不幸的是,不使用重用标识符会产生相同的结果。我可以确认角点出现在3.2中,而不是3.1.x中。您的示例项目在我的环境中具有相同的行为。值得注意的是,当我将表格切换为普通表格显示时,黑色角落仍然出现。对不起,我帮不了你(黑色从何而来?如果您将视图控制器中的backgroundColor设置为红色,您会看到红色吗?此外,dumpWindows()函数可能会有所帮助,请参阅:黑色似乎不是来自我代码中的任何地方。我已尝试将整个应用程序上的所有颜色更改为“清除”。在示例应用程序中,视图的背景色为蓝色,而tableview的背景色为红色。我签出了dumpWindows()输出结果如下:感谢您的关注。单元格第一次正确呈现,但只有在返回时才会出现混乱。在这个返回中,单元格绘制代码根本不会被调用,而是从一些内部缓存中提取出来。在这个修复之后,即使在返回后,它们也会正确呈现。这确实修复了错误
cell.backgroundView.alpha = 0.4;
cell.selectedBackgroundView.alpha = 0.4;