我正在开发iphone应用并定位 iOS 4.0 或更高版本。我正在尝试将图像添加到UIImageView,图像采用 jpeg格式。这就是我到目前为止所做的......
UIImageView *bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image = [UIImage imageNamed:@"background"];
[self.view addSubview:bgImageView];
[bgImageView release];
我添加了两张图片,
但是当我构建并运行时,一切都运行良好,除了没有背景。我的所有其他小部件都在那里,但是有一个白色背景,图像没有显示。
接下来,我为我的背景创建了两个png图像,将其添加到项目中并运行。这次是我的背景。我很困惑,因为根据documentation jpg图像可以在iphone中使用UIImage。
我再次尝试使用我的jpg图像并将上面的代码更改为
UIImageView *bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image = [UIImage imageNamed:@"background.jpg"]; //added extension
[self.view addSubview:bgImageView];
[bgImageView release];
当我运行上面的代码时,显示背景图像,但未加载2x图像。这表明我的jpg图像很好,并不是罪魁祸首。因此,当我只提供没有扩展名的图像名称时,png文件(包括1x和2x)都加载到各自的设备上,jpg文件根本没有加载。 看起来像一个错误(在sdk或文档中)。 iOS 4在这里度过了美好的一年。为什么没有人注意到它?除了将我的所有图像转换为png之外,还有什么选择吗?
编辑:
那么,问题还有两天,零回答。我已经将我的所有图像转换为png,并且我的项目的那部分已经完成(因为我的项目无法等待......)。尽管如此,为了我自己和为了将来面对这一切的每个人,我想更多地了解这个问题。至少有人可以确认这确实是一个苹果虫。我正在开始赏金,以便更多人可以看到这个帖子。
再次编辑
此奖金剩余2天结束。感谢所有回复的人。但让我澄清一件事。我已经说过我已将所有图像转换为png而且我一直在移动。我只想确认imageNamed
以同样的方式处理jpg和png文件。文档肯定会说(除非Apple在UIImage
文档以外的地方写过)。如果文档是正确的,那么由于两个可能的原因我的代码失败了
imageNamed
中的错误。如果这是原因,那么除了提交错误报告,将我的图像更改为png或写一个包装器(比如Chandan在他的回答中已经说过),我没有太多的选择,并继续前进.. 还有一件事。 This帖子也只是讲述了这个问题。但他不知道背后的原因。所以我并不孤单。
编辑:结束
这与图像本身有关。我用Google搜索并下载了一些示例jpeg图像并使用它进行播放。其中一些显示正确,一些没有。由于限制时间到了,我正在向PengOne提供限制,他试图重现错误并成功加载jpg图像而没有扩展,让我使用更多图像。感谢所有试图提供帮助的人。
答案 0 :(得分:11)
根据UIImage
班级参考:
<强>讨论强>
此方法在系统缓存中查找具有的图像对象 指定名称并返回该对象(如果存在)。如果匹配 图像对象尚未在缓存中,此方法加载图像 来自指定文件的数据,缓存它,然后返回 结果对象。
在运行iOS 4或更高版本的设备上,如果是,则行为相同 设备的屏幕比例为1.0。如果屏幕的比例为2.0, 此方法首先搜索具有相同文件名的图像文件 附加一个@ 2x后缀。例如,如果文件的名称是 按钮,它首先搜索按钮@ 2x。如果找到2x,则加载 该图像并设置返回的UIImage对象的scale属性 到2.0。否则,它会加载未修改的文件名并设置比例 属性为1.0。有关更多信息,请参阅iOS Application Programming Guide 有关支持不同比例因子图像的信息。特别
<强>考虑强>
在iOS 4及更高版本中,无需指定文件名 文件扩展名。在iOS 4之前,您必须指定文件名 扩展
由于您的目标是iOS 4.0及更高版本,因此不需要文件扩展名。我试图重现这个潜在的错误,但它没有文件扩展名我的预期工作。
以下是在您的应用中创建此效果可能出错的一些想法:
如果您在某个时候更改了图像,问题可能来自缓存。
如果您选择不使用文件扩展名,并且同时将“background.jpg”和“background.png”作为选项,则首选项似乎是使用“.png”文件。
如果您在首次运行应用程序后将目标设置为iOS 4.0及更高版本,则需要使用文件扩展名,并且图像可能已缓存为空白,这可以追溯到理论1.
这是我能做到的最好的。
答案 1 :(得分:7)
写一个包装器来获取像
这样的图像-(UIImage*) getImage:(NSString*)imageName{
UIImage *image;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
NSString *jpegFile = [imageName stringByAppendingString:@"@2x.jpg"];
image = [UIImage imageNamed:jpegFile];
}
else{
NSString *jpegFile = [imageName stringByAppendingString:@".jpg"];
image = [UIImage imageNamed:jpegFile];
}
return image;
}
从您的代码调用
bgImageView.image = getImage(@"background");
答案 2 :(得分:5)
随着Xcode 6的出现,我发现在某些iOS7设备上可能无法呈现JPG图像(它们可能在某些设备上有效但在其他设备上无用,或者它们可能无法在任何设备上运行,您可能会看到不同的结果在不同的开发者机器上,似乎没有任何一致性)。无论图像是在XIB中的UIImageView中引用还是使用[UIImage imageNamed:](返回nil)进行编程,都是如此。
长时间挠头后,解决方案是将* .jpg文件扩展名重命名为* .png(显然将文件内容保留为JPG数据)。
HTH
答案 3 :(得分:1)
您只需提供图片的全名即可。
bgImageView.image = [UIImage imageNamed:@"background.jpg"];
不要忘记延期。
对于@ 2x,没有必要在代码中的任何地方调用它。如果您正确编码,则无需像这里建议的那样测试视网膜显示器。
答案 4 :(得分:-1)
你可以使用jpgs,只是自己尝试过它并且有效。唯一的建议是你如何实例化它。 试试这种方式:
stockImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Morbo.jpg"]];
stockImage.frame = CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height) ;
[self.view addSubview:stockImage];
这是我使用的图像: