在空白UIViewController中,我通过以下方式更改屏幕颜色:
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackPattern.png"]];然后,我从我的iPhone 5中截取了一个屏幕截图,图片如下:

如果以100%的比例查看图像,您将看到三个条形图(顶部、左侧和底部)。但是,我的模式图像非常简单(blackPattern@2x.png):

这是一个用于视网膜显示的8x8 png。
具有讽刺意味的是,当应用程序在模拟器上运行时,这些条是不可见的。它是特定于iPhone 5硬件的症状吗?
附注:如果你想看到它运行,你可以下载我的应用程序:here
发布于 2013-02-15 19:10:39
有意思的。我可以在iPhone 5上重现这个问题(不能在模拟器上重现,甚至在视网膜模式下也不行)。
一些想法和观察:小patten图像中的颜色完全是黑白的(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;
}使用这段代码中的颜色,我无法重现这个问题(即使我使用了模式拼贴,并将拼贴的大小设置为略有偏差)。
发布于 2013-02-14 10:18:49
我不知道这是不是你真正的问题,但这一行:
self.view.backgroundColor = [UIColor colorWithPatternImage:
[UIImage imageNamed:@"blackPattern.png"]];..。意味着无论设备是不是视网膜,你都在使用名为"blackPattern.png“的文件。这一行应该是:
self.view.backgroundColor = [UIColor colorWithPatternImage:
[UIImage imageNamed:@"blackPattern"]];..。(末尾没有.png )。这样,如果不是视网膜,你的程序将使用"blackPattern.png“,如果设备是视网膜,则使用"blackPattern@2x.png”。
可能,您正在运行这段代码的模拟器是非视网膜的,所以它看起来很好;您看到的问题只是一个视网膜设备。
发布于 2013-02-19 23:13:10
它看起来像是你在创建UIImageView或UIView,背景透明。由于您正在使用的图像包含不透明和透明两种颜色,因此您仍然可以透过它进行查看。
https://stackoverflow.com/questions/14768331
复制相似问题