我不是图形专家,但我通过将背景视图设置为带有一些CG代码的backgroundView,设法制作了一些外观漂亮的自定义UITableViewCells。在所有SDK中高达3.1.3(可能是3.2 ......我还没有在iPad上测试过),这种方法效果很好,但我认为更新的SDK已经引入了图形缓存在屏幕外的方式的变化。
首次渲染时,一切都很棒:绘图很好,角落是透明的。如果我在导航堆栈上按下几个视图控制器并返回,那么视图中会出现黑角:
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=clearColor
和opaque=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下面。
我创建了一个simple sample application来突出显示问题。
答案 0 :(得分:5)
我测试了样本应用程序,可以重现黑角问题。
经过一些实验,黑角问题似乎与用于渲染表视图的图层的缓存有关。细胞层的几何形状似乎很重要:
为了摆脱黑角你可以:
[UIColor groupTableViewBackgroundColor].CGColor
作为填充颜色;它是基于图案的颜色,遵循设备方向(是的);但这幅画与背景并不完全一致(该死的)。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有关。
祝你好运!