径向 CGGradient 中的严重色带

Harsh colour banding in radial CGGradient

CGContextDrawRadialGradient 在渐变的中心产生一个非常明显的“十字”:

代码(简化):

- (void)drawRect:(NSRect)dirtyRect {
    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];

    size_t numberOfGradientLocations = 2;
    CGFloat startRadius = 0.0f;
    CGFloat endRadius = 30.0f;
    CGPoint centre = CGPointMake(floorf(self.bounds.size.width / 2), floorf(self.bounds.size.height / 2));
    CGFloat gradientColours[8] = {0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    CGFloat gradientLocations[2] = {0.0f, 1.0f};

    CGColorSpaceRef colourspace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colourspace, gradientColours, gradientLocations, numberOfGradientLocations);
    CGContextDrawRadialGradient(context, gradient, centre, startRadius, centre, endRadius, kCGGradientDrawsBeforeStartLocation);
}

这在 macOS 和 iOS 上都会发生。同时,相同类型的渐变在 WebKit 中完美呈现 CSS(所以这不是一些“显示不佳”的问题)。

我做错了什么?有解决这个问题的已知方法吗?

这是我在 iOS 上看到的;我使用 iPhone 7 Plus 模拟器 100% 使每个像素都可见,看起来非常平滑:

编辑 经过一些实验,我怀疑您看到的是点和像素之间未对齐造成的摩尔纹效果。