如何迭代Stickers.xcassets或从xcassets获取图像?

时间:2016-09-18 18:36:11

标签: ios swift

我正在使用自定义贴纸应用扩展程序,我想循环浏览我的Sticker.xcassets文件夹而不是设置固定的for循环。

例如:

func getStickers() {

    for index in 1...16 {
        addSticker(location: "\(index)", description: "\(index)")
    }
}

2 个答案:

答案 0 :(得分:0)

您可能知道不使用字符串文字路径访问项目文件夹中的文件。而是使用NSBundle提供的功能。令人高兴的是,这些功能可以满足您的需求。在以下位置查看NSBundle的开发人员参考:

https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html

我认为你想从这份文件中得到的清单是3-11,它描述了如何从捆绑中提取给定类型的所有资产:

CFArrayRef  birdURLs;

// Find all of the JPEG images in a given directory.
birdURLs = CFBundleCopyResourceURLsOfType( mainBundle,
                CFSTR("jpg"),
                CFSTR("BirdImages") );

希望有所帮助!

答案 1 :(得分:0)

您无法在运行时以编程方式访问.xcassets文件。我也在做类似的任务,我提出的解决方案非常简单。使用以下约定命名图像:imageNameAndIdentifier(例如:heart0,heart1,heart2等)。使用构建图像全名并创建UIImage的循环,我得到所有需要的图像。

    let stickerName = "heart"
    var images = [UIImage]()
    var lastImageIndex = 0

    lastImageIndex = lastStickerImageIndex(name: stickerName)

    for index in 0...lastImageIndex {
        images.append(UIImage.init(named: stickerName + "\(index)"))
    }

注意lastImageIndex变量。它的值是根据文件数计算的,文件包含文件名中给定的字符串和减去一个单位,因为最后一个索引是=(length_of_array - 1)。

private func lastStickerImageIndex(name: String) -> Int {
    return (FileManager.default.numberOfFilesWhichNameContains(string: name) - 1)
}

我创建了一个扩展程序,它根据一个字符串返回文件数,该字符串应该包含在所需的文件名中。

extension FileManager {

    func numberOfFilesWhichNameContains(string: String) -> Int {

        do {
            let bundleFiles = try self.contentsOfDirectory(atPath: Bundle.main.bundlePath)
            let filteredBundleFiles = bundleFiles.filter({
                $0.contains(string)
            })

            return filteredBundleFiles.count

        } catch let error {
            print(error)
        }

        return 0
    }

}