Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 仅在导航弹出后,分组UITableViewCells上的黑色角_Iphone_Cocoa Touch_Uiview_Uitableview - Fatal编程技术网

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

Iphone 仅在导航弹出后,分组UITableViewCells上的黑色角,iphone,cocoa-touch,uiview,uitableview,Iphone,Cocoa Touch,Uiview,Uitableview,我不是一个图形专家,但我通过一些CG代码将背景视图设置为背景视图,设法制作了一些好看的自定义分组UITableViewCells。在3.1.3之前的所有SDK中(可能是3.2…我还没有在iPad上测试过),这一切都很好,但我认为最近的SDK在屏幕外缓存图形的方式上引入了变化 在第一次渲染时,一切都很好:绘图很好,角是透明的。如果我按下导航堆栈上的两个视图控制器并返回,现在视图中会出现黑色的角点: 前后 (来源:) (来源:) 我有大量的代码。我已经尽我最大的努力调整,查看文档中适用的更改,但

我不是一个图形专家,但我通过一些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
    方法,因为不再需要它
将此内容抛在脑后(或许会有所帮助),将以下内容添加到CellForRowatineXpath中会产生有趣的效果:

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;