【问题标题】:Loading images from Images.xcassets从 Images.xcassets 加载图像
【发布时间】:2014-06-27 17:22:58
【问题描述】:

我正在尝试从捆绑包中加载 100 多个图像,但最近我只是好奇从捆绑包中动态加载图像的最佳做法是什么。自定义 Images.xcassets 是否允许我执行此类任务?如何动态加载 NSArray?

【问题讨论】:

    标签: ios objective-c cocoa-touch ios7 ios6


    【解决方案1】:

    首先我会推荐我的答案,不要这样做。

    对于您的应用来说,一次加载 100 张图像并将它们存储在内存中确实有点过头了,而且应用肯定会承受一定的内存压力。

    在 Xcode 5 中,.xcassets 仍然是将图像保存在 app bundle 中的最佳位置。有关更多详细信息,您可能对Apple Asset Catalog 文档感兴趣。但是,我建议您将它们的标识符(实际上是添加到 .xcassets 的图像名称)存储在数组中,而不是将图像加载和存储到 NSArray。如果您事先将图像标识符存储到一些NSString* const 也会很有帮助。

    所以你的编码结构应该如下所示:

    //image names
    NSString* const kImage1 = @"image1";
    NSString* const kImage2 = @"image2";
    NSString* const kImage3 = @"image3"; 
    //...etc
    
    NSArray* imageIdentifiers = @[kImage1, kImage2, kImage3,...];
    
    //...
    

    然后从你可以使用的包中加载单个图像:

    UIImage* img = [UIImage imageNamed:kImage3]; //loads image3 from bundle and caches
    

    或遍历您可能使用的所有图像:

    for (NSString* identifier in imageIdentifiers) {
        @autoreleasepool { //make sure your image data gets disposed after use
            UIImage* img = [UIImage imageNamed:identifier];
            //... use img, etc.
        }
    }
    

    最后,UIImage 类的imageNamed: 方法将图像缓存在系统缓存中。因此,如果您重复使用一个文件,您就不必担心从文件中重新加载它。

    【讨论】:

    • 如果我事先不知道图像的名称怎么办?有没有办法在目录中搜索并加载所有图片?
    • @bobbyjoe93 这完全是另一回事。我在这里描述的想法是针对您始终知道资源标识符的捆绑资源。您始终可以使用[[NSFileManager defaultManager] contentsOfDirectoryAtPath:<# your path #> error:NULL]; 将目录的内容放入数组中,并使用UIImage 类的imageWithContentsOfFile: 方法从那里加载图像,同时枚举数组。但该过程与资源加载无关。您通常需要该方法来加载瞬态图像。
    猜你喜欢
    • 2016-05-25
    • 2014-11-14
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2014-01-18
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多