渐变背景适用于 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
Swift 和 TestFlight 适用于 iOS 8 但不适用于 iOS 7
Open in... 自定义文件类型适用于 iOS 5、6 和 7,但不适用于 iOS 4