有趣。我可以在iPhone 5上重现这个问题(不是在模拟器上,甚至不是在视网膜模式下)。
一些想法和观察:小图案图像中的颜色完全是黑白的(每个r、b和g都是0和255)。但在全屏图像中却不是这样。在中心位置是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;
}
使用这个代码中的颜色,即使我玩弄图案平铺并将瓷砖大小设置为略微偏离,也无法复制问题。
colorWithPatternImage
會取你提供的圖片,並連續瓦片以填滿視圖的背景。你遇到了什麼具體問題? - FeifanZ