UIImage imageWithContentsOfFile:不适用于iOS8

时间:2014-08-13 06:15:23

标签: uiimage ios8 beta

当我在iOS8 beta3和beta5上测试我的应用时,我发现了一个关于[UIImage imageWithContentsOfFile:]的错误。

当图像资源存储在主包的子包中时,如果我们通过以下方法初始化UIImage,它将返回nil:

NSString *testBundlePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"bundle”];
NSBundle *bundle = [NSBundle bundleWithPath:testBundlePath];
NSString *path = [bundle pathForResource:@"play.png" ofType:nil];

UIImage *image = [UIImage imageWithContentsOfFile:path]; //iOS8 image = nil, iOS7 image != nil

但是当图像资源存储在主束中时,UIImage Initialization可以通过以下方法成功:

NSString *path = [[NSBundle mainBundle] pathForResource:@"play.png" ofType:nil];

UIImage *image = [UIImage imageWithContentsOfFile:path]; //iOS8 and iOS7 image != nil

我们在iOS8 beta3下发现了这个问题,它仍然存在于iOS8 beta 5下。

The Demo app directory structure was below:
      XXX.app
           |----test~ipad.bundle
                |----play.png
           |----test~iphone.bundle
                |----play.png
           |----play.png
           |----play~iphone.png
           |----play~ipad.png
         ......

有没有人有同样的问题?我认为这是iOS8上的一个错误,因此,许多应用程序使用bundle来组织资源,例如图像。但是现在,这个bug将使成千上万的应用程序变得丑陋且难以使用。我们真的希望Apple可以在下一个版本中修复这个bug,否则,我的所有应用都必须为这个bug开发一个新版本!

4 个答案:

答案 0 :(得分:5)

它实际上没有被破坏,你只是发送错误的路径。 我猜你正在使用模拟器,并在你的应用程序的某个地方保存了一个文件,然后记下了该文件的完整路径。但是,当您重建应用程序时,已安装应用程序的UUID会更改,并且您保存的路径不再有效(即使文件仍然存在)。您可以通过选中[[NSFileManager defaultManager] currentDirectoryPath]来查看当前的有效路径。请注意,每次重新构建和重新部署应用时,值都会更改。

要访问您的实际文件,您需要执行以下操作:

NSString *image = @"myImage.png";

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cache = [paths objectAtIndex:0];
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", cache, image];
UIImage *image = [UIImage imageWithContentsOfFile:fullPath];

答案 1 :(得分:0)

pathForResource:ofType:仅查看Resources文件夹(和本地化文件夹)。如果要将文件放入捆绑包中的专用文件夹,则需要使用pathForResource:ofType:inDirectory:并提供目录名称。

答案 2 :(得分:0)

Apple修复了iOS8.1上的这个错误,干杯

答案 3 :(得分:0)

只需使用

NSString *fullPath = [bundle pathForResource:name ofType:@"png"];
NSData *data = [NSData dataWithContentsOfFile:fullPath];
UIImage *image = [UIImage imageWithData:data];