2011-09-26 99 views
3

我正在为我的UIView的每个背景执行CAGradientLayer,但我遇到了一个小问题。渐变看起来不够光滑。颜色之间的过渡将呈现。你可以在这张照片中看到它。CAGradientLayer不够流畅吗?

Wrong gradient screenshot

这是怎么了我在的UIView初始化实现这个梯度。

CAGradientLayer *layer = [CAGradientLayer layer]; 
layer.colors = [NSArray arrayWithObjects: 
       (id)[[UIColor darkKinepolisColor] CGColor], 
       (id)[[UIColor lightKinepolisColor] CGColor], 
       (id)[[UIColor lightKinepolisColor] CGColor], 
       (id)[[UIColor darkKinepolisColor] CGColor], 
       nil]; 
layer.locations = [NSArray arrayWithObjects: 
        [NSNumber numberWithFloat:0], 
        [NSNumber numberWithFloat:0.4], 
        [NSNumber numberWithFloat:0.6], 
        [NSNumber numberWithFloat:1], 
        nil]; 
layer.startPoint = CGPointMake(0, 0); 
layer.frame = self.layer.bounds; 
layer.endPoint = CGPointMake(1, 1); 
layer.contentsGravity = kCAGravityResize; 
[self.layer addSublayer:layer]; 

难道你,优秀的开发人员能帮我解决这个问题吗?谢谢!

+0

我发现设备上的渐变通常比模拟器看起来更光滑。 – jonsibley

回答

2

这不就是8位颜色值的结果吗?颜色之间的步骤尽可能小。

即,如果您想要rgb(100,100,100)和rgb(109,109,109)之间的渐变,它只能在10像素的渐变宽度内完全平滑。如果您尝试在100像素的宽度上绘制此渐变,您将获得10块10px宽的颜色块,并且它看起来非常块。还会发生什么?

您可以通过抖动和增加噪音使其看起来更平滑,但没有内置功能。

因此,要么选择较远的颜色,在较短的距离上绘制渐变或在Photoshop中制作图形,并应用噪声和抖动以使其看起来更平滑。

5

从我看到的CAGradientLayer不支持抖动,但CGGradient做。看到我的回答here。有关使用CGGradient的示例,另请参阅其他答案。

0

栅格化与您的设备的屏幕比例,将非常光滑和脆!

[layer setShouldRasterize:YES]; 
[layer setRasterizationScale:[UIScreen mainScreen].scale]; 
+1

我已经测试过这个,它不会导致渐变抖动,因此仍然是条纹。 – Dermot

1

我正在开发,需要一个碱梯度的应用程序,以及各种其他梯度褪色到它,这取决于各种因素(例如:一天中的时间)。我发现,除了基本渐变外,我可以继续使用CAGradientLayer。对于基本渐变,我创建它在Photoshop中,并添加了0.554%的噪音。几乎察觉不到,但它可以防止当我在它上面设置CAGradientLayer s的动画时产生的条纹效果。

所以我想答案是你需要在至少一个渐变上进行抖动/噪声以避免出现条带效应。也可以以编程方式添加该图像,或者通过在噪声层上使用低alpha(〜0.1f)的CAGradientLayer加载带有噪声的预先渲染的黑色图像。