渐变背景适用于 iOS 8 但不适用于 iOS 7

Posted

技术标签:

【中文标题】渐变背景适用于 iOS 8 但不适用于 iOS 7【英文标题】:Gradient backgrounds work in iOS 8 but not iOS 7 【发布时间】:2014-06-29 17:28:32 【问题描述】:

所以我正在构建一个以表格视图为中心的应用程序,并尝试使用以下代码为每个表格视图单元格包含渐变背景:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = cell.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.94 green:0.84 blue:0.49 alpha:1.0]CGColor], (id)[[UIColor colorWithRed:0.93 green:0.86 blue:0.61 alpha:1.0]CGColor], nil];
[cell.layer insertSublayer:gradient atIndex:0];
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.textColor = [UIColor colorWithRed:0.25 green:0.51 blue:0.00 alpha:1.0];

现在,在我正在使用的运行 ios 8(使用 Xcode 6 Beta 2)的模拟器中,我得到以下结果:

但是在我的设备上(对于辅助触摸,我的锁定按钮坏了......),运行 iOS 7,它看起来像这样:

我在整个应用程序中的主视图背景中的渐变都适用,只是表格单元格视图中的渐变不起作用。正如您在这些屏幕截图中看到的那样,部分标题视图也有渐变,但它们在两个版本中都有效。我需要寻找某个标志才能使其在 iOS 7 中正常工作吗?

编辑: 这在 cellForRowAtIndexPath 中被调用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = cell.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.94 green:0.84 blue:0.49 alpha:1.0]CGColor], (id)[[UIColor colorWithRed:0.93 green:0.86 blue:0.61 alpha:1.0]CGColor], nil];
[cell.layer insertSublayer:gradient atIndex:0];
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.textColor = [UIColor colorWithRed:0.25 green:0.51 blue:0.00 alpha:1.0];

NSDictionary *match;
if(indexPath.section == 0) 
    match = [_inprogressMatches objectAtIndex:indexPath.row];
 else if(indexPath.section == 1) 
    match = [_finalMatches objectAtIndex:indexPath.row];
 else 
    match = [_pregameMatches objectAtIndex:indexPath.row];


NSDictionary *homeTeam = [match objectForKey:@"homeTeamId"];
NSDictionary *awayTeam = [match objectForKey:@"awayTeamId"];    
cell.textLabel.text = [NSString stringWithFormat:@"%@ %@ : %@ %@",[awayTeam objectForKey:@"name"] , [match objectForKey:@"awayScore"], [match objectForKey:@"homeScore"], [homeTeam objectForKey:@"name"]];

return cell;

【问题讨论】:

请显示更多代码。该代码在哪里被调用?显示完整的上下文。 您还展示了不同的操作系统版本(7 和 8)。在 iOS 7 模拟器和 iOS 8 模拟器上看起来一样吗? 为什么不设置单元格的backgroundView?真的没有必要像这样弄乱它的层,而且你可能在任何情况下都做错了(你可能一遍又一遍地添加层,即使单元格已经有了层——尽管很难做到当然,因为您没有显示足够的代码)。 我同意@DavidRönnqvist - 你为什么不使用 iOS 7 模拟器? 所以在 iOS 7 模拟器中,同样的事情也会发生,不过我现在要仔细检查一下 【参考方案1】:

要将渐变放在单元格的背景中,请不要弄乱它的图层(无论如何你都做错了,因为你没有检查重复使用的单元格中是否存在图层)。

给单元格一个backgroundView,其层是渐变或具有渐变作为子层。这就是backgroundView 的用途。

【讨论】:

这样做:[cell.backgroundView.layer insertSublayer:gradient atIndex:0];似乎也不适用于 iOS 8 模拟器。这是你建议我做的吗? 您必须制作背景视图。我在这里讨论的实际代码:apeth.com/iOSBook/ch21.html#_registering_a_cell_class 太棒了,谢谢马特!这就像一个魅力。上面的链接有我需要的一切

以上是关于渐变背景适用于 iOS 8 但不适用于 iOS 7的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 中的 UITabBarController 适用于 iOS 8 但不适用于 7

适用于 iOS 8 但不适用于 iOS 7 的简单动画

Swift 和 TestFlight 适用于 iOS 8 但不适用于 iOS 7

Open in... 自定义文件类型适用于 iOS 5、6 和 7,但不适用于 iOS 4

初始屏幕显示完美适用于 ios 7.1 但不适用于 iPad 中的 ios 6.1

iOS 8 代码适用于 iPhone 5s 但不适用于 iPhone 5