我正在使用自定义贴纸应用扩展程序,我想循环浏览我的Sticker.xcassets文件夹而不是设置固定的for循环。
例如:
func getStickers() {
for index in 1...16 {
addSticker(location: "\(index)", description: "\(index)")
}
}
答案 0 :(得分:0)
您可能知道不使用字符串文字路径访问项目文件夹中的文件。而是使用NSBundle提供的功能。令人高兴的是,这些功能可以满足您的需求。在以下位置查看NSBundle的开发人员参考:
我认为你想从这份文件中得到的清单是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
}
}