我有一个像这样的普通Xcode项目......
注意那里有一个名为" images"的文件夹(它是一个实际的文件夹 - 而不仅仅是一个组)。它包含25" .png"图像。
我想要做的就是为每个图片制作 UIimage
数组。
(或者甚至是一个图像名称或类似的数组,没关系 - 然后可以加载它们UIImage(named:
)
如何进入该文件夹"图像" ??那么子文件夹" images / cars"?
我尝试过类似的东西,但却找不到任何东西......
override func viewDidLoad()
{
let imageArray = NSBundle.mainBundle().URLsForResourcesWithExtension(
"png", subdirectory: "images")
print("test...")
for n:NSURL in imageArray!
{ print("found ..." ,n) }
}
答案 0 :(得分:6)
我们假设图像位于应用程序的资源包中。如果不是,您需要确保您的图像目录列在"复制捆绑资源"在"构建阶段"目标。
修改强> 这只是将图像复制到应用程序包中,如果您需要根据下面的代码将文件夹复制到应用程序包中,请使用关注StackOverflow question进行正确设置。
这为我们提供了一系列URL,然后我们可以使用UIImage(data :)和NSData(contentsOfURL :)来在需要时创建图像。
获取bundle的资源路径并附加图像目录,然后获取目录的内容。
if let path = NSBundle.mainBundle().resourcePath {
let imagePath = path + "/images"
let url = NSURL(fileURLWithPath: imagePath)
let fileManager = NSFileManager.defaultManager()
let properties = [NSURLLocalizedNameKey,
NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey]
do {
let imageURLs = try fileManager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: properties, options:NSDirectoryEnumerationOptions.SkipsHiddenFiles)
print("image URLs: \(imageURLs)")
// Create image from URL
var myImage = UIImage(data: NSData(contentsOfURL: imageURLs[0])!)
} catch let error1 as NSError {
print(error1.description)
}
}
答案 1 :(得分:4)
乔。
请尝试以下方法:
我目前的情况如下。 enter image description here
您必须将图像注册到"复制捆绑资源"。
您必须在主Bundle中添加过滤器模块。 enter image description here
它也在我这边工作。 也许你可以改变" jpg"格式化为" png"之一。
我已经在iOS 10.x之后,Swift 3.0和xcode 8.1版本上进行了测试。 如果您有任何问题,请与我联系。
答案 2 :(得分:3)
您可以按照以下步骤下载它们:
在finder中创建一个新文件夹并添加所有图像(或文件夹,... 一切)。
更改文件夹名称+“.bundle”(例如:YourListImage -> YourListImage.bundle).
将文件夹添加到项目。
添加文件管理器扩展:
extension FileManager {
func getListFileNameInBundle(bundlePath: String) -> [String] {
let fileManager = FileManager.default
let bundleURL = Bundle.main.bundleURL
let assetURL = bundleURL.appendingPathComponent(bundlePath)
do {
let contents = try fileManager.contentsOfDirectory(at: assetURL, includingPropertiesForKeys: [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey], options: .skipsHiddenFiles)
return contents.map{$0.lastPathComponent}
}
catch {
return []
}
}
func getImageInBundle(bundlePath: String) -> UIImage? {
let bundleURL = Bundle.main.bundleURL
let assetURL = bundleURL.appendingPathComponent(bundlePath)
return UIImage.init(contentsOfFile: assetURL.relativePath)
}
}
使用:
let fm = FileManager.default
let listImageName = fm.getListFileNameInBundle(bundlePath: "YourListImage.bundle")
for imgName in listImageName {
let image = fm.getImageInBundle(bundlePath: "YourListImage.bundle/\(imgName)")
}
答案 3 :(得分:2)
Swift 4
if let path = Bundle.main.resourcePath {
let imagePath = path + "/images"
let url = NSURL(fileURLWithPath: imagePath)
let fileManager = FileManager.default
let properties = [URLResourceKey.localizedNameKey,
URLResourceKey.creationDateKey,
URLResourceKey.localizedTypeDescriptionKey]
do {
let imageURLs = try fileManager.contentsOfDirectory(at: url as URL, includingPropertiesForKeys: properties, options:FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
print("image URLs: \(imageURLs)")
// Create image from URL
let firstImageURL = imageURLs[0]
let firstImageData = try Data(contentsOf: firstImageURL)
let firstImage = UIImage(data: firstImageData)
// Do something with first image
} catch let error as NSError {
print(error.description)
}
}
答案 4 :(得分:1)
我建议不要一次将所有图像加载到数组中。图像往往很大,很容易耗尽内存并崩溃。
除非您必须立即将所有图像都存储在内存中,否则最好保留一组路径或URL,并根据需要一次加载一个图像。
假设文件夹中包含大量图片,您可以使用NSBundle方法URLsForResourcesWithExtension:subdirectory:
为图像子目录中的所有文件获取NSURL
数组,或者使用特定文件filetype或ALL文件(如果你为扩展名传递nil。)
一旦你有一个文件网址数组,你可以根据需要将它映射到一个路径数组,然后将那个映射到一个图像数组。