gpt4 book ai didi

iphone - 仅在导航弹出后分组 UITableViewCell 上才会出现黑色角

转载 作者:行者123 更新时间:2023-12-03 18:36:03 25 4
gpt4 key购买 nike

我不是图形专家,但我通过使用一些CG代码将背景 View 设置为backgroundView,设法制作了一些好看的自定义分组UITableViewCells。在 3.1.3 之前的所有 SDK 中(也许是 3.2...我还没有在 iPad 上进行过测试),这工作得很好,但我认为更新的 SDK 已经改变了图形在屏幕外缓存的方式。

第一次渲染时,一切都很棒:绘图很好,角落是透明的。如果我在导航堆栈上推送几个 View Controller 并返回, View 中现在会出现黑色角:

之前&&之后

alt text
(来源:tinygrab.com)
alt text
(来源:tinygrab.com)

我有大量代码,most of which is written up here 。我已尝试尽我所能进行调整,查看文档以了解适用的更改,但在至少 8 小时后我仍然找不到可能导致此问题的原因。我已尝试将我能想到的每个 View 设置为 backgroundColor=clearColoropaque=NO 我还缺少什么?有什么调试技巧吗?

更新:

我在 viewDidAppear 中有一些调试代码,用于打印所有 subview 的背景颜色和类描述。

- (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];
}
}

使用此代码,我会在第一次加载时检查单元格 View 的背景颜色设置(当情况良好时),然后在返回后再次检查。有一些差异,但所有颜色仍然设置为清晰。这让我相信问题出在 UITableViewCell 之下。

更新 2:

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

最佳答案

我已经测试了示例应用程序,并且可以重现黑角问题。

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

  • 在第一次绘制时,要求将单元格绘制成矩形。您的代码正在绘制圆形路径,但剪掉了角。由于基础 TableView 已经绘制,因此不会出现问题。矩形区域被缓存,其角未被绘制。
  • 按下 Controller 时,会存储缓存的图像,并带有单元格的矩形占位符。
  • 弹出 Controller 时,将绘制缓存的图像和单元格。但是绘制单元格的位置是矩形的,但单元格的缓存图像不是矩形,导致出现黑角。

为了消除黑角,您可以:

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

希望对大家有一点帮助。

更新

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

我重新阅读了单元格层的代码,并找到了一种以简单的方式去除黑角的方法。基本思想是,只有当渐变颜色清晰时,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 方法,因为不再需要它。

关于iphone - 仅在导航弹出后分组 UITableViewCell 上才会出现黑色角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com