我正在为CAGradientLayer
的每个背景做UIView
,但我遇到了一个小问题。渐变似乎不够平滑。颜色之间的过渡将呈现。你可以在这张照片中看到它。
这是我在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 :(得分: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];