Iphone 为什么辐射层不够光滑?

Iphone 为什么辐射层不够光滑?,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在为我的UIViews的每个背景做CAGradientLayer,但我有一个小问题。坡度似乎不够平滑。将呈现颜色之间的过渡。你可以在这张照片上看到 这就是我在UIView的初始值设定项中实现此渐变的方式 CAGradientLayer *layer = [CAGradientLayer layer]; layer.colors = [NSArray arrayWithObjects: (id)[[UIColor darkKinepolisColor] CGC

我正在为我的
UIView
s的每个背景做
CAGradientLayer
,但我有一个小问题。坡度似乎不够平滑。将呈现颜色之间的过渡。你可以在这张照片上看到

这就是我在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];

你们这些优秀的开发人员能帮我解决这个问题吗?谢谢

这不只是8位颜色值的结果吗?颜色之间的台阶尽可能小

i、 e.如果你想在rgb(100100100)和rgb(109109109)之间建立一个渐变,那么它只能在10像素的渐变宽度上完全平滑。如果你试着在100像素的宽度上画这个渐变,你会得到10块10px宽的颜色,看起来非常块状。还可能发生什么

您可以通过抖动和添加噪波使其看起来更平滑,但没有用于此的内置函数


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

据我所知,CAGradientLayer不支持抖动,但CGGradient支持。看看我的答案。还可以查看其他答案,例如使用CGGradient。

使用设备的屏幕比例进行光栅化,将非常平滑和清晰

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

我正在开发一个应用程序,它需要一个基本的渐变,根据各种因素(例如:一天中的时间),其他各种渐变都会消失在其中。我发现我可以继续使用CAGradientLayer,但基本渐变除外。对于基础渐变,我在photoshop中创建了它,并添加了0.554%的噪波。几乎无法察觉,但当我在其上方设置
CAGradientLayer
s的alpha动画时,它会阻止带状效果


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

我发现设备上的渐变看起来比模拟器平滑得多。我已经测试过,这不会导致渐变抖动,因此条纹仍然存在。