面白い。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;
}
このコードの色を使用しても、問題を再現できませんでした (パターンのタイリングで遊んで、タイルのサイズを少しずらして設定しましたが)。