CAGradientLayer 不适用于 iOS 7(但适用于 iOS 6)

Posted

技术标签:

【中文标题】CAGradientLayer 不适用于 iOS 7(但适用于 iOS 6)【英文标题】:CAGradientLayer is not working on iOS 7 (But working on iOS 6) 【发布时间】:2013-09-13 03:34:22 【问题描述】:

我正在使用下面的代码向我的表格单元格添加细微渐变效果。

    // add a layer that overlays the cell adding a subtle gradient effect
    CAGradientLayer* gradientLayer = [CAGradientLayer layer];
    NSLog(@"%@",NSStringFromCGRect(cell.bounds));
    gradientLayer.frame = cell.bounds;
    gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
                             (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
                             (id)[[UIColor clearColor] CGColor],
                             (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
    gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
    [cell.layer insertSublayer:gradientLayer atIndex:0];

代码运行后,我可以看到 CAGradientLayer 已添加到我的 cell.layer 中。但是当我在 ios 7 模拟器上运行该应用程序时,我根本看不到它。

<CALayer:0xaca1980; sublayers = (<CAGradientLayer: 0xaad2110>, <CALayer: 0xaca2a70>); 

代码在 iOS 6 上运行没有任何问题。

如果 CAGradientLayer 在 iOS 7 上不再工作,我该怎么做才能为表格单元格添加渐变?

提前致谢。

【问题讨论】:

【参考方案1】:

我通过将单元格背景颜色设置为清除来解决此问题。 在这种情况下,您可以将索引保持为 0,这样会显示元素,同时也会显示渐变。

cell.backgroundColor = [UIColor clearcolor];
[cell.layer insertSublayer:gradientLayer atIndex:0];

【讨论】:

【参考方案2】:

根据我上面的评论,这对我来说有点模糊。似乎在 iOS6 上进行了几次测试后,我有 2 个子层,而对于 iOS7,我有 1 个子层。这与插入索引有关的事情超出了我的范围。我不明白为什么将渐变放置在索引 1 处是可行的……doh! :)

但出于我的需要,我要求渐变出现在其他所有内容之上,因此我没有将上面的答案与操作系统检查一起使用(顺便说一句,效果很好!!),我做了类似的事情:

[self.layer insertSublayer:_gradientLayer above:[self.layer.sublayers firstObject]];

【讨论】:

【参考方案3】:

我已经通过更改解决了这个问题

[cell.layer insertSublayer:gradientLayer atIndex:0];

[cell.layer insertSublayer:gradientLayer atIndex:1];

为了向后兼容。我正在使用这样的代码

    if ([Common isiOS7]) 
        [self.layer insertSublayer:_gradientLayer atIndex:1];
    
    else 
        [self.layer insertSublayer:_gradientLayer atIndex:0];
    

【讨论】:

知道为什么吗?为我工作,但我不“明白”它。 :) 这些都不适合我。当我使用建议的解决方案时,单元格中的 ui 元素、图像和标签不显示,它们隐藏在渐变下。【参考方案4】:

更新 2016 年 4 月

所以我在遇到类似问题时偶然发现了这个问题。对我来说,以下奇迹般地成功了:

而不是使用gradient.colors = @[*colors*], 我不得不使用gradient.colors = [NSArray arrayWithObjects: *colors*, nil]

可能是 Apple 错误,或者是我不明白的问题。希望这对任何人都有帮助!

【讨论】:

以上是关于CAGradientLayer 不适用于 iOS 7(但适用于 iOS 6)的主要内容,如果未能解决你的问题,请参考以下文章

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

iOS中利用CAGradientLayer绘制渐变色的方法实例

如何在 iOS 的 xamarin 表单中创建渐变按钮背景

圆形 CAGradientLayer 蒙版 - iOS

用于不同视图的 CAGradientLayer

iOS 7.0 中的水平 CAGradientLayer