Ответ 1
Интересно. Я могу воспроизвести проблему на 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;
}
Используя цвет из этого кода, я не смог воспроизвести проблему (даже если я играл с черепицей рисунка и немного уменьшил размер плиток).