CAGradientLayer不够流畅?

时间:2011-09-26 12:05:46

标签: iphone objective-c ios

我正在为CAGradientLayer的每个背景做UIView,但我遇到了一个小问题。渐变似乎不够平滑。颜色之间的过渡将呈现。你可以在这张照片中看到它。

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];

优秀的开发人员可以帮我解决这个问题吗?谢谢!

4 个答案:

答案 0 :(得分:5)

从我看到的CAGradientLayer不支持抖动,但CGGradient确实如此。请参阅我的回答here。另请参阅其他答案,例如关于使用CGGradient。

答案 1 :(得分:2)

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

即。如果你想要rgb(100,100,100)和rgb(109,109,109)之间的渐变,它只能在10像素的渐变宽度上完全平滑。如果你试图在100像素的宽度上绘制这个渐变,你会得到10块10px宽的颜色,看起来很块。还会发生什么?

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

所以,要么选择相距较远的颜色,要在较短的距离上绘制渐变,要么在Photoshop中制作图形并应用噪点和抖动使其显得更加平滑。

答案 2 :(得分:1)

我正在开发一个需要基本渐变的应用程序,并且各种其他渐变都会逐渐消失,具体取决于各种因素(例如:一天中的时间)。我发现除了基本渐变之外,我可以继续使用CAGradientLayer。对于基本渐变,我在photoshop中创建了它并添加了0.554%的噪点。几乎难以察觉,但是当我在其上方CAGradientLayer的alpha动画处理时,它会阻止条纹效果。

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

答案 3 :(得分:0)

使用您设备的屏幕刻度进行栅格化,将非常流畅和清晰!

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