首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone 5硬件上的奇怪colorWithPatternImage

iPhone 5硬件上的奇怪colorWithPatternImage
EN

Stack Overflow用户
提问于 2013-02-08 16:15:59
回答 3查看 939关注 0票数 12

在空白UIViewController中,我通过以下方式更改屏幕颜色:

代码语言:javascript
复制
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackPattern.png"]];

然后,我从我的iPhone 5中截取了一个屏幕截图,图片如下:

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

这是一个用于视网膜显示的8x8 png。

具有讽刺意味的是,当应用程序在模拟器上运行时,这些条是不可见的。它是特定于iPhone 5硬件的症状吗?

附注:如果你想看到它运行,你可以下载我的应用程序:here

EN

回答 3

Stack Overflow用户

发布于 2013-02-15 19:10:39

有意思的。我可以在iPhone 5上重现这个问题(不能在模拟器上重现,甚至在视网膜模式下也不行)。

一些想法和观察:小patten图像中的颜色完全是黑白的(0和255,分别是r,b和g)。在全屏图像中并非如此。中间是8和247,底部是12,243,侧面是4,251。

这看起来非常像插值工件:当Core Graphics将图像中的像素绘制到设备像素上,而这些像素不完全匹配时,它会计算相邻源像素的插值颜色。黑色和白色会导致暗灰色和明亮的灰色:我们在这种情况下看到的效果。

我仍然不明白为什么这种情况只发生在设备上。

玩了一下这个问题,我没有找到原因,但你的问题的解决方案:自己创建棋盘图案颜色:

代码语言:javascript
复制
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;
}

使用这段代码中的颜色,我无法重现这个问题(即使我使用了模式拼贴,并将拼贴的大小设置为略有偏差)。

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 10:18:49

我不知道这是不是你真正的问题,但这一行:

代码语言:javascript
复制
self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern.png"]];

..。意味着无论设备是不是视网膜,你都在使用名为"blackPattern.png“的文件。这一行应该是:

代码语言:javascript
复制
self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern"]];

..。(末尾没有.png )。这样,如果不是视网膜,你的程序将使用"blackPattern.png“,如果设备是视网膜,则使用"blackPattern@2x.png”。

可能,您正在运行这段代码的模拟器是非视网膜的,所以它看起来很好;您看到的问题只是一个视网膜设备。

票数 0
EN

Stack Overflow用户

发布于 2013-02-19 23:13:10

它看起来像是你在创建UIImageView或UIView,背景透明。由于您正在使用的图像包含不透明和透明两种颜色,因此您仍然可以透过它进行查看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14768331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档