我是iOS和Xcode的新手。
我尝试用
加载图片[UIImage imageNamed:@"imageName.png/jpg and so on"];
但它只返回nil。图像应该在我的项目包中,考虑到我可以从InterfaceBuilder中的拖放菜单中选择它,并通过“添加文件到”项目名“...”菜单将其添加到Xcode。
使用.png或.jpg图像没有区别,结果保持不变:它们通过IB工作,但如果我尝试自己运行imageNamed方法则不行。
答案 0 :(得分:85)
只有几个原因可以使用imageNamed来恢复图像:
图片不在您的包中。确保图像实际上在您的项目中。确保通过单击文件并选择它所属的目标来检查目标。
您的图片名称拼写不正确或扩展名有问题。
您使用的是视网膜显示器,但没有@ 2x图像。尝试将模拟器更改为视网膜,看看它是否显示出来。
如果您使用的是资产目录,请确保在属性检查器中选择了正确的设备。
一些提示:
如果您正在使用模拟器进行测试,请从模拟器中删除应用程序并清理项目,然后重新运行。如果它仍然出现,它应该显示在你的手机上(如果它不是它可能是文件名或@ 2x版本的问题)。
如果您在手机上测试并且没有显示,请确保您使用的是相同版本的模拟器(如果您有iPhone 4 / 4s,请务必使用带有视网膜的4 / 4s模拟器)
根据这篇文章的最后一件事:JPG image doesn't load with UIImage imageNamed使用imageNamed的某些JPG类型存在一些问题,没有扩展名。 IMO,你应该使用PNG,因为iOS会为你压缩,除非你只需要使用JPG。
答案 1 :(得分:17)
Re Mike Weller的评论。复选框是....
答案 2 :(得分:9)
我刚刚在磁盘“file.jpg”上命名的jpg文件存在此问题
我试图加载没有扩展名,只是@“file”。虽然这适用于pngs,但它不适用于jpg。一旦我使用@“file.jpg”,它就有用了!
答案 3 :(得分:5)
如果您验证了上述所有内容并且发现您的UIImage(名为:“myImage”)从正在构建的动态框架内的代码返回nil ,那么您必须更改代码到:
UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)
这应该正确地从CXAssets中检索资产。
答案 4 :(得分:2)
快速5
如果在动态框架中获得UIImage nil,则应使用捆绑标识符设置图像。
您可以像这样为Bundle创建扩展名;
创建扩展名;
extension Bundle {
public static let myFramework = Bundle(identifier: "com.myFramework.bundle")
}
然后像这样使用;
UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)
或
您可以这样使用
UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)
我认为第一个对于可读代码很有用。
享受
答案 5 :(得分:1)
尝试使用UIImage(contentsOfFile:)
代替imageNamed
。下载的图像对我有用。
答案 6 :(得分:1)
检查文件末尾没有空格。
像name @2x.png
这样的名称将无法加载,但name@2x.png
很好
答案 7 :(得分:1)
我有一个类似的问题,最后清理修复它:图像显示在模拟器中,但在iPhone上运行应用程序时ID没有出现。
我做了什么:
1)从iPhone删除了应用程序
2)执行产品/清洁
之后,错误被修复,图像出现了!
答案 8 :(得分:1)
尝试重新导出图片。
我有一个类似的问题,UIImage imageNamed返回零,这些答案都没有解决我的问题。
我发现png文件实际上有问题。我在GIMP图像编辑器中打开文件,将其保存为新文件,再次将其导出为png,然后神奇地开始工作。
我根本没有更改代码中的任何内容,因此实际的图像文件肯定有问题。
答案 9 :(得分:1)
我遇到了同样的问题:@“photo.jpg”导致了'nil'UIImage。 更改为“实际”文件规范,@“photo.JPG”工作正常! 我没有意识到那里有区分大小写!非常不直观。
答案 10 :(得分:0)
确保您拥有.xcassets文件中正在使用的DEVICE的图像。标记为iPad的图像不会显示在手机(或模拟手机)上。
答案 11 :(得分:0)
尝试
[UIImage imageNamed:@"imageName.png"];
代替(带扩展名)
答案 12 :(得分:0)
除了@Inturbidus的回答: 对于那些来到这里工作应用程序扩展的人:
您正在使用的图片应属于两个目标 - 托管的应用和扩展程序。
在其他情况下,您始终会nil
尝试从扩展程序代码中访问它。
答案 13 :(得分:0)
对于Xcode 6.4,单击Images.xcassets并检查您调用的每个图像是否有条目。您可以右键单击图像,然后选择"在Finder中显示"检查图像是否添加了正确的图像。
答案 14 :(得分:0)
确保图像的“属性检查器”名称字段与您正在使用的名称完全匹配。在我的情况下,图像是文件夹的一部分,因此图像名称是"文件夹/名称"。使用这个长名称解决了这个问题。 XCode 7.3.1
答案 15 :(得分:0)
就我而言,使用带有重音字符的名字被证明是个糟糕的主意。我将Astéroïdes改为Asteroids并且工作正常。
答案 16 :(得分:0)
图像是在模拟器上工作,而不是在设备上工作吗?
如果是这样,在这种情况下, 始终 与名称的情况有关。该设备需要精确的外壳,如果我没记错的话,模拟器就不那么挑剔了。
e.g。对于名为 image.png
的图片[UIImage imageNamed:@"Image"];
可以在模拟器上工作但不能在设备上工作......
答案 17 :(得分:0)
就我而言,问题在于资产目录中的图像名称。 例如,如果您的图像名称为“ TEst”,并且将名称更改为“ Test”,则更改将不会被索引。如果您的队友将通过此更改进行提交,则其资产目录中的图像将具有以前的名称“ TEst”。 抓住这种情况的机会很小,但是有可能。
答案 18 :(得分:0)
我的项目中有多个.xcassets,其中2个具有重复的图像名称。因此就我而言,它不是加载图像。