CAGradientLayer无法在iOS 7上运行(但在iOS 6上运行)

时间:2013-09-13 03:34:22

标签: ios calayer ios7

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

    // 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,我该怎么办才能将渐变添加到我的表格单元格中?

提前致谢。

4 个答案:

答案 0 :(得分:4)

我通过将单元格背景颜色设置为清除来修复此问题。 在这种情况下,您可以将索引保持为0,因此显示元素,并且也显示渐变。

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

答案 1 :(得分:3)

根据我上面的评论,对我来说这有点模糊。似乎在iOS6上进行了一些测试之后我有2个子层,对于iOS7,我有1.这与索引的插入有什么关系超出了我。我不明白为什么在索引1处放置渐变有效... doh! :)

但是根据我的需要,我要求渐变显示在其他所有内容之上,所以不要使用上面的操作系统检查(这完全没用BTW !!),我做了类似的事情:

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

答案 2 :(得分:2)

我已通过更改

解决了此问题
[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];
    }

答案 3 :(得分:0)

更新 2016年4月

所以当我遇到类似的问题时,我偶然发现了这个问题。对我来说,以下奇迹般的伎俩:

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

可能是苹果虫,或者我不明白的东西。希望这有助于任何人!