有趣的。我可以在 iPhone 5 上重现该问题(不在模拟器上,甚至在视网膜模式下)。
一些想法和观察: 小图案图像中的颜色恰好是黑色和白色(0 和 255,每个 r、b 和 g)。在全屏图像中它不是。中间是 8 和 247,底部是 12,243,侧面是 4,251。
这看起来很像一个插值工件:当 Core Graphics 将图像中的像素绘制到设备像素上并且像素不完全匹配时,它会根据相邻源像素计算插值颜色。黑色和白色会产生深灰色和亮灰色:我们在这种情况下看到的效果。
我仍然不知道为什么这只发生在设备上。
玩一点这个问题我没有找到原因,但解决了您的问题:自己创建棋盘图案颜色:
static void patternDrawPatternCallback(void *info, CGContextRef c)
{
for (int y = 0; y < 8; ++y) {
for (int x = 0; x < 8; ++x) {
CGFloat v = (x + y) & 1;
CGContextSetRGBFillColor(c, v, v, v, 1);
CGContextFillRect(c, (CGRect){{x, y}, {1, 1}});
}
}
}
static void patternReleaseInfoCallback(void *info)
{
}
static UIColor *checkerColor()
{
CGPatternCallbacks callbacks = {
.drawPattern = patternDrawPatternCallback,
.releaseInfo = patternReleaseInfoCallback,
};
CGFloat scale = 1.0f / [UIScreen mainScreen].scale;
CGPatternRef pattern = CGPatternCreate(NULL,
(CGRect){.size={8, 8}},
CGAffineTransformMakeScale(scale, scale),
8, 8,
kCGPatternTilingConstantSpacing,
YES,
&callbacks);
CGFloat components[] = {1, 1, 1, 1};
CGColorSpaceRef colorspace = CGColorSpaceCreatePattern(NULL);
CGColorRef color = CGColorCreateWithPattern(colorspace, pattern, components);
CGColorSpaceRelease(colorspace);
CGPatternRelease(pattern);
UIColor *checkerColor = [UIColor colorWithCGColor:color];
CGColorRelease(color);
return checkerColor;
}
使用此代码中的颜色我无法重现该问题(即使我使用了图案平铺并将平铺的大小设置为略微偏离)。