Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone 5硬件上的奇怪颜色和图案图像_Iphone_Objective C_Hardware - Fatal编程技术网

iPhone 5硬件上的奇怪颜色和图案图像

iPhone 5硬件上的奇怪颜色和图案图像,iphone,objective-c,hardware,Iphone,Objective C,Hardware,在空白UIViewController中,我通过以下方式更改屏幕颜色: self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackPattern.png"]]; 然后我用我的iPhone5做了一个屏幕截图。图像如下所示: 如果您100%查看图像,您将看到三个栏(顶部、左侧和底部)。然而,我的模式图像非常简单(blackPattern@2x.png): 它是用于视网膜显示的8x8

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

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackPattern.png"]];
然后我用我的iPhone5做了一个屏幕截图。图像如下所示:

如果您100%查看图像,您将看到三个栏(顶部、左侧和底部)。然而,我的模式图像非常简单(blackPattern@2x.png):

它是用于视网膜显示的8x8PNG

讽刺的是,当应用程序在模拟器上运行时,这些条并不可见。它是iPhone5特定于硬件的符号吗


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

我不知道这是否是你的问题,但这行:

self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern.png"]];
。。。表示您正在使用名为“blackPattern.png”的文件,无论设备是否为视网膜。线路应为:

self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern"]];
。。。(末尾没有
.png
)。这样,您的程序将在非视网膜和blackPattern@2x.png“如果设备是视网膜


很可能,您运行此代码的模拟器是非视网膜的,因此看起来很好;这只是一个视网膜设备,你看到了问题。

有趣。我可以在iPhone5上重现这个问题(不是在模拟器上,甚至不是在视网膜模式下)

一些想法和观察:小图案图像中的颜色完全是黑色和白色(0和255,分别为r、b和g)。在全屏图像中,它不是。中间是8和247,底部是1243,侧面是4251

这看起来很像一个插值伪影:当核心图形将图像中的像素绘制到设备像素上,并且像素不完全匹配时,它会计算相邻源像素的插值颜色。黑色和白色会产生暗灰色和亮灰色:我们在本例中看到的效果

我仍然不知道为什么这只发生在设备上

对这个问题稍加研究,我没有找到原因,但找到了解决问题的方法:自己创建棋盘格图案颜色:

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;
}
静态void patternDrawPatternCallback(void*info,CGContextRef c)
{
对于(int y=0;y<8;++y){
对于(int x=0;x<8;++x){
cgv=(x+y)&1;
CGContextSetRGBFillColor(c,v,v,v,1);
CGContextFillRect(c,(CGRect){{x,y},{1,1});
}
}
}
静态void模式releaseInfoCallback(void*info)
{
}
静态UIColor*checkerColor()
{
CGPatternCallbacks回调={
.drawPattern=patternDrawPatternCallback,
.releaseInfo=模式releaseinfocallback,
};
CGFloat比例=1.0f/[UIScreen Main Screen]。比例;
CGPatternRef pattern=CGPatternCreate(空,
(CGRect){.size={8,8},
CGAffineTransformMakeScale(比例,比例),
8, 8,
kCGPatternTilingConstantSpacing,
对
&回调);
CGFloat组件[]={1,1,1,1};
CGColorSpaceRef colorspace=CGColorSpaceCreatePattern(空);
CGColorRef color=CGColorCreateWithPattern(颜色空间、图案、组件);
CGCOLORSPACTERELEASE(色彩空间);
cgpattern释放(pattern);
UIColor*checkerColor=[UIColor color WITHCGCOLOR:color];
cgcolorelease(彩色);
返回棋盘格颜色;
}

使用此代码中的颜色,我无法重现问题(即使我使用了图案平铺并将平铺的大小设置为稍微偏移)。

看起来您正在创建UIImageView或UIView,并且背景透明。由于您正在使用的图像包含不透明和透明颜色,因此您仍然可以看穿它。

我觉得它看起来不错
colorWithPatternImage
获取您提供的图像并连续平铺以填充视图的背景。您遇到的具体问题是什么?@Inspire48您没有注意到图像左侧、顶部和底部的不同图案吗?您看到iPhone本身的条形图了吗?在我看来,它完全一样。我想我知道为什么——我有视网膜MBP。它具有完美显示图像的像素。我确实在非视网膜显示器(通过HDMI连接到我的rMBP)上看到变色的条带,但是顶部和左侧的条带大约有一厘米宽(尽管这取决于显示器),底部的条带宽4到5倍。这就是你所描述的吗?是的,我可以看到iPhone上的底部栏。左侧和顶部在iPhone上不太明显。底部钢筋比左侧和顶部钢筋厚4到5倍。事实上,在一位用户报告了这个问题之后,我注意到了奇怪的图案。当你使用图案图像时,你应该使用大于8 x 8的大图像。试着看看像120x120这样的东西,这不太准确;iOS将加载@2x,即使您有.PNG结尾。此外,“在iOS 4及更高版本上,如果文件为PNG格式,则无需指定.PNG文件扩展名。在iOS 4之前,您必须指定文件扩展名。”是否指定.PNG结尾没有任何区别。@Inspire48:我相信您是对的,但我找不到任何明确的参考来支持这一点。的类引用使用无扩展名的文件名示例。你有一个很好的链接吗?我想你可以找到一个链接,但是快速进入Xcode会显示你可以保留扩展,系统仍然会加载@2x图形。你可以通过将模拟器设置为使用视网膜设备(在硬件菜单下)来判断。为什么你认为模式图像是透明的?我是不是漏掉了什么?嗯,看起来这张照片可以看穿。你的格子图案是否包含“白色”的透明区域?不,图案图像完全不透明,但我可以重现这个问题。