我在评估的iOS项目中看到了一个自定义的资源包,因此至少我知道这是可能的。
我的问题是,我正在使用一个CATiledLayer来处理一张图片的约22,000个瓦片,并且编译时间非常长(半小时干净构建,普通构建需要5-10分钟)。因此,我希望将所有图像制作成自定义的资源包,以便使其可移植,并且希望它不会每次重新编译到应用程序包中。
我该怎么做?我查阅了文档,但没有看到有关如何实际创建该资源包的说明。
答案非常简单
在Finder中创建一个文件夹,将文件添加到其中,将其重命名为bundlename.bundle
将其拖入Xcode-成功!
要访问,请使用PathToMainBundle+"/bundlename.bundle"的形式
如何创建一个bundle
.bundle
(例如,"New folder" -> "BundleName.bundle")。提示:您随时可以右键单击文件夹并点击“显示包内容”,以添加、删除或修改任何文件。
如何将bundle添加到Xcode
如何使用bundle
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *resource = [bundle pathForResource:@"fileName" ofType:@"fileType"];
(用适当的名称替换BundleName
、fileName
和fileType
)
另外还有两个有用的建议:
首先,在Xcode中查看Bundle的内容,您需要在文件检查器实用面板中设置其类型为“应用程序Bundle”。您仍然无法通过Xcode复制到和复制。您需要使用终端,但Xcode会立即更新它。
其次,为了在Bundle中使用资源,这是一个有用的代码片段...
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"AquarianHarp" ofType:@"bundle"];
NSString *imageName = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"trebleclef2" ofType:@"png"];
UIImage *myImage = [[UIImage alloc] initWithContentsOfFile:imageName];
如我在上面的评论中提到的那样,你实际上不需要加载bundle(因为它不能执行),而且ofType
需要与你实际文件的大小写匹配,这样才能在设备上工作。在模拟器中两种方式都可以使用,所以不要被这个红色警告所迷惑!
最后,你不需要将资源放置在bundle的“Resources”子文件夹中。似乎你可以使用任意布局,但可能存在未知的性能影响。
这是我让它正常工作的方法:在Xcode中创建一个新文件|资源|设置束。然后在Finder中选择该束并选择“显示包内容”,然后添加任何图像文件。
然后在代码中引用图像的方式如下:
NSString *imgName = @"bundlename.bundle/my-image.png";
UIImage *myImage = [UIImage imageNamed:imgName];
FrameworkResources.bundle
) 的步骤 - 这非常不明显,尤其适用于创建静态框架。
SDKROOT
) 更改为 "iOS"关于在Xcode项目中打包和读取文件的笔记
print(Bundle.main.resourcePath!+"/temp.bundle/test.txt")
输出:/Users/James/Library/Developer/Xcode/DerivedData/GitSyncMac-heiwpdjbtaxzhiclikjotucjguqu/Build/Products/Debug/GitSyncMacApp.app/Contents/Resources/temp.bundle/test.txtprint(content(Bundle.main.resourcePath!+"/temp.bundle/test.txt")) // testing
static func content(_ path:String)->String?{
do {
let content = try String(contentsOfFile:path, encoding:String.Encoding.utf8) as String//encoding: NSUTF8StringEncoding
return content
} catch {
return nil
}
}
创建可加载的捆绑项目就像创建应用程序一样,您只需要选择适当的项目模板即可。执行以下步骤创建可加载的捆绑项目:
构建和运行,在Xcode中,您将在项目导航器的产品文件夹中看到捆绑文件。右键单击捆绑并选择“在Finder中显示”。
pathForResource:ofType
的ofType
部分使用了大写字母(ofType:@"PNG"
),这在模拟器上可以正常工作,但在实际设备上不行。因此,我想说您无需调用非可执行bundle上的load方法来获取资源。 - Hari Honor.bundle
后缀的情况下发生的事情相同。换句话说,对于“bundle”而言,您的定义和期望是什么?如果您想要的只是将一堆东西拖到Xcode中以包含在应用程序中,那么您可以在不重命名为.bundle
后缀的情况下完成此操作。 - matt