CAGradientLayer 在 UITableView backgroundColor 上不起作用

Posted

技术标签:

【中文标题】CAGradientLayer 在 UITableView backgroundColor 上不起作用【英文标题】:CAGradientLayer doesn't work on UITableView backgroundColor 【发布时间】:2014-08-01 23:39:13 【问题描述】:

我想在带有透明导航栏的表格视图后面添加渐变背景色。

代码如下,但渐变色不显示。

在简单的普通UIViewController 中尝试了CAGradientLayer 的代码部分,它确实有效。

为什么它在UITableViewController 中不起作用?

- (void)viewDidLoad

    [super viewDidLoad];

    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [UIImage new];
    self.navigationController.navigationBar.translucent = YES;

    self.data = @[@"Xrsi", @"Liang", @"La", @"Dn", @"Piao", @"69", @"Sun", @"Mon", @"Xrsi", @"Dn", @"Lan", @"Liang", @"Piao", @"69", @"Sun", @"Mon"];

    UIColor * baseColor = [[UIColor alloc] initWithRed:0.016 green:0.729 blue:0.933 alpha:1.000];

    CGFloat hue;
    CGFloat saturation;
    CGFloat brightness;
    CGFloat alpha;

    self.cellColors = [[NSMutableArray alloc] initWithObjects:baseColor, nil];
    if ([baseColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) 
        for (NSUInteger i = 0; i < [self.data count]; i ++) 
            brightness = brightness - 0.025;
            UIColor * newColor = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha];
            [self.cellColors addObject:newColor];
        
    

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    UIColor * bottomColor = [self.cellColors lastObject];
    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = self.view.frame;
    gradientLayer.colors = [NSArray arrayWithObjects:(id)baseColor.CGColor, (id)bottomColor.CGColor, nil];
    [self.view.layer insertSublayer:gradientLayer atIndex:0];



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

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

    cell.backgroundColor = self.cellColors[indexPath.row];
    cell.textLabel.text = self.data[indexPath.row];
    cell.textLabel.textColor = [UIColor whiteColor];

    return cell;

【问题讨论】:

【参考方案1】:

    创建一个普通的 UIView,它的层是一个渐变层,适当配置(听起来你已经知道怎么做)。

    将该视图设为表格视图的backgroundView

    没有第3步。

【讨论】:

是的!有用!为什么只有backgroundView 可以在UITableView 上工作? 不管为什么。他们给了你一个backgroundView 就是为了这个目的,所以你所要做的就是使用它。基本上,表格视图是一组巨大的复杂视图和层;将您自己的图层插入其中是行不通的。使用您提供的工具。不要框架作斗争; 学习框架。 谢谢你!但我对UITableViewController 的层次结构感到困惑,因为它有self.viewself.tableViewself.tableView.backgroundView。如果为UITableView 的背景和/或backgroundColor 设置属性,它们中的哪一个是真实的? 对于一个表格视图控制器,self.viewself.tableView 是一回事。但是第二个已经被转换为表格视图了。 所以这两个小于self.tablView.backgroundView 即整个屏幕的大小。我的理解正确吗?

以上是关于CAGradientLayer 在 UITableView backgroundColor 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CAGradientLayer功能

CAGradientLayer 导致子视图不可见

如何切换 CAGradientLayer?

在 CAGradientLayer 上方显示 SCNScene

UILabel 上的 CAGradientLayer 无法旋转

在 UITableViewCell 中的 UITextView 上使用 CAGradientLayer