Resource Programming Guide (三)

图像,声音和视频资源

OS X和iOS平台的建立是为了提供丰富的多媒体体验。为了支持这种经验,这两个平台为您的应用程序中加载和使用图像,声音和视频资源提供了大量支持。图像资源通常用于绘制应用程序用户界面的部分。声音和视频资源的使用频率较低,但也可以增强应用程序的基本外观和吸引力。以下部分描述了在应用程序中处理图像,声音和视频资源的支持。

Nib文件中的图像和声音

使用Xcode,您可以从nib文件中引用应用程序的声音和图像文件。您可以这样做,将这些图像或声音与视图或控件的不同属性相关联。例如,您可以将默认图像设置为在图像视图中显示,或将图像设置为显示按钮。在nib文件中创建这样一个连接可以节省您在加载nib文件时稍后进行连接的麻烦。

要在nib文件中使图像和声音资源可用,您需要做的就是将它们添加到Xcode项目中; Xcode然后在库窗格中列出它们。当您连接到给定的资源文件时,Xcode在nib文件中记录该连接。在加载时,nib加载代码在项目包中查找该资源,在构建时应该由Xcode放置。

加载包含图像和声音资源引用的nib文件时,nib加载代码尽可能高速缓存资源,以便以后轻松检索。例如,加载nib文件后,您可以使用NSImage或UIImage(取决于您的平台)的imageNamed:方法检索与该nib文件相关联的映像。在OS X中,您可以使用NSSound的soundNamed:方法来检索缓存的声音资源。

加载图像资源

图像资源通常用于大多数应用。即使非常简单的应用程序使用图像来创建自定义外观的控件和视图。 OS X和iOS为使用Objective-C对象处理图像数据提供广泛的支持。这些对象使得使用图像图像非常容易,通常只需要几行代码来加载和绘制图像。如果您不想使用Objective-C对象,还可以使用Quartz使用基于C的界面加载图像。以下部分描述使用每种可用技术加载图像资源文件的过程。

在Objective-C中加载图像

要在Objective-C中加载图像,可以使用NSImage或UIImage对象,具体取决于当前平台。使用AppKit框架为OS X构建的应用程序使用NSImage对象加载图像并绘制它们。为iOS构建的应用程序使用UIImage对象。在功能上,当涉及到加载现有图像资源时,这两个对象都提供了几乎相同的行为。通过将对象指针指向应用程序包中的图像文件来初始化对象,并且图像对象负责加载图像数据的详细信息。

清单3-1显示了如何使用OS X中的NSImage类加载映像资源。找到映像资源(在这种情况下在应用程序包中)时,只需使用该路径初始化映像对象。初始化后,您可以使用NSImage的方法绘制图像,或将该对象传递给可以使用该对象的其他方法。要在iOS中执行完全相同的任务,您需要做的只是将NSImage的引用更改为UIImage。

清单3-1加载图像资源

NSString* imageName = [[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
NSImage* imageObj = [[NSImage alloc] initWithContentsOfFile:imageName];

您可以使用图像对象来打开目标平台上支持的任何类型的图像。每个对象通常都是一个轻量级的包装器,用于更高级的图像处理代码。要在当前图形上下文中绘制图像,您只需使用其绘图相关方法之一即可。 NSImage和UIImage都有几种以不同方式绘制图像的方法。 NSImage类还提供额外的支持来操作您加载的图像。

有关NSImage和UIImage类的方法的信息,请参阅NSImage类参考和UIImage类参考。有关NSImage类的其他功能的更多详细信息,请参阅Cocoa绘图指南中的图像。

使用Quartz加载图像

如果您正在编写基于C的代码,则可以使用Core Foundation和Quartz调用的组合将映像资源加载到应用程序中。 Core Foundation提供了定位图像资源并将相应的图像数据加载到内存中的初始支持。 Quartz将您加载到内存中的图像数据转换为可用的CGImageRef,然后您的代码可以用来绘制图像。

使用Quartz加载图像有两种方法:数据提供者和图像源对象。数据提供者可以在iOS和OS X中使用。图像源对象仅在OS X v10.4及更高版本中可用,但利用Image I / O框架来增强数据提供者的基本图像处理能力。当涉及到加载和显示图像资源时,这两种技术都非常适合这项工作。只有当您希望更好地访问与图像相关的数据时,您才可能喜欢数据提供者的图像源。

清单3-2显示了如何使用数据提供者加载JPEG图像。此方法使用Core Foundation捆绑支持来定位应用程序主包中的图像,并获取其中的URL。然后使用该URL创建数据提供者对象,然后为相应的JPEG数据创建一个CGImageRef。 (为了简洁起见,此示例省略了任何错误处理代码,您自己的代码应确保任何引用的数据结构都有效)

清单3-2使用数据提供者加载映像资源

CGImageRef MyCreateJPEGImageRef (const char *imageName);
{
    CGImageRef image;
    CGDataProviderRef provider;
    CFStringRef name;
    CFURLRef url;
    CFBundleRef mainBundle = CFBundleGetMainBundle();

    // Get the URL to the bundle resource.
    name = CFStringCreateWithCString (NULL, imageName, kCFStringEncodingUTF8);
    url = CFBundleCopyResourceURL(mainBundle, name, CFSTR("jpg"), NULL);
    CFRelease(name);

    // Create the data provider object
    provider = CGDataProviderCreateWithURL (url);
    CFRelease (url);

    // Create the image object from that provider.
    image = CGImageCreateWithJPEGDataProvider (provider, NULL, true,
                                    kCGRenderingIntentDefault);
    CGDataProviderRelease (provider);

    return (image);
}

有关使用Quartz图像的详细信息,请参见Quartz 2D编程指南。有关数据提供者的参考信息,请参阅Quartz 2D参考集合(OS X)或Core Graphics Framework Reference(iOS)。

在iOS中指定高分辨率图像

iOS应用程序应包含高分辨率版本的图像资源。当应用程序在具有高分辨率屏幕的设备上运行时,高分辨率图像提供额外的细节,并且看起来更好,因为它们不需要缩放以适应空间。您可以为应用程序包中的每个图像资源提供高分辨率图像,包括图标和启动图像。

要指定图像的高分辨率版本,请创建一个版本,其宽度和高度(以像素为单位)是原始图像的两倍。您可以使用图像中的额外像素来提供更多细节。保存图像时,使用相同的基本名称,但在基本文件名和文件扩展名之间包含字符串@ 2x。例如,如果您有一个名为MyImage.png的图像,高分辨率版本的名称将是MyImage@2x.png。将图像的高分辨率和原始版本放在应用程序包中的相同位置。

当底层设备具有高分辨率屏幕时,捆绑和图像加载程序将自动查找带有@ 2x字符串的图像文件。如果您将@ 2x字符串与其他修饰符相结合,则@ 2x字符串应位于任何设备修饰符之前,但应位于所有其他修饰符之后,例如启动方向或URL方案修饰符。例如:

MyImage.png - 图像资源的默认版本。

MyImage@2x.png - 具有Retina显示设备的图像资源的高分辨率版本。
MyImage〜iphone.png - iPhone和iPod touch的图像版本。
MyImage@2x~iphone.png - 具有Retina显示屏的iPhone和iPod touch设备的图像的高分辨率版本。
当您要加载图像时,在代码中指定图像名称时,请勿包含@ 2x或任何设备修饰符。例如,如果您的应用程序包包含上述列表中的映像文件,则会要求一个名为MyImage.png的映像。系统自动确定哪个版本的图像最合适并加载。类似地,当使用或绘制该图像时,您不必知道它是原始分辨率还是高分辨率版本。图像绘制程序根据加载的图像自动调整。但是,如果您仍然想知道图像是原始还是高分辨率版本,您可以检查其缩放因子。如果图像是高分辨率版本,它的比例因子被设置为不是1.0的值。

有关如何支持高分辨率设备的更多信息,请参阅在视图中支持高分辨率屏幕。

数据资源文件

将应用程序的数据与代码分离可以使以后更容易修改应用程序。如果将应用程序的配置数据存储在资源文件中,则可以更改该配置,而无需重新编译应用程序。数据资源文件可用于存储任何类型的信息。以下部分突出显示了iOS和OS X支持的一些数据资源类型。

属性列表文件

属性列表文件是在应用程序代码之外存储自定义配置数据的一种方式。 OS X和iOS广泛地使用属性列表来实现功能,如用户首选项和捆绑包的信息属性列表文件。您可以类似地使用属性列表来存储应用程序的私有(或公开)配置数据。

属性列表文件本质上是一组结构化数据值。您可以以编程方式或使用属性列表编辑器应用程序(位于/ Developer / Applications / Utilities)中创建和编辑属性列表。自定义属性列表文件的结构完全取决于您。您可以使用属性列表来存储字符串,数字,布尔值,日期和原始数据值。默认情况下,属性列表将数据存储在单个字典结构中,但您可以将其他字典和数组分配为值以创建更多分层数据集。

有关使用属性列表的信息,请参阅“Core Foundation”的“属性列表编程指南”和“属性列表编程主题”。

OS X数据资源文件

表4-1列出了Mac应用程序支持的其他资源文件类型。

表4-1其他资源类型

资源类型
描述
AppleScript文件
在OS X中,AppleScript术语和套件文件包含有关应用程序可脚本性的信息。 这些文件可以使用文件扩展名.sdef,.scriptSuite或.scriptTerminology。 因为用于脚本应用程序的实际AppleScript命令在用户脚本和脚本编辑器应用程序中可见,因此需要对这些资源进行本地化。 有关支持AppleScript的信息,请参阅AppleScript概述。

帮助文件

在OS X中,帮助内容通常由使用标准文本编辑程序创建并在Help Viewer应用程序中注册的一组HTML文件组成。 (有关如何使用帮助查看器注册的信息,请参阅Apple帮助编程指南。)也可以将PDF文件,RTF文件,HTML文件或其他自定义文档嵌入到您的软件包中,并使用外部应用程序打开它们,如预览 或Safari。 有关如何打开文件的信息,请参阅Launch Services编程指南。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容