Resource Programming Guide (三)

圖像,聲音和視頻資源

OS X和iOS平臺的建立是為了提供豐富的多媒體體驗。為了支持這種經(jīng)驗携栋,這兩個平臺為您的應用程序中加載和使用圖像,聲音和視頻資源提供了大量支持咳秉。圖像資源通常用于繪制應用程序用戶界面的部分婉支。聲音和視頻資源的使用頻率較低,但也可以增強應用程序的基本外觀和吸引力澜建。以下部分描述了在應用程序中處理圖像向挖,聲音和視頻資源的支持。

Nib文件中的圖像和聲音

使用Xcode炕舵,您可以從nib文件中引用應用程序的聲音和圖像文件何之。您可以這樣做,將這些圖像或聲音與視圖或控件的不同屬性相關聯(lián)咽筋。例如溶推,您可以將默認圖像設置為在圖像視圖中顯示,或將圖像設置為顯示按鈕晤硕。在nib文件中創(chuàng)建這樣一個連接可以節(jié)省您在加載nib文件時稍后進行連接的麻煩悼潭。

要在nib文件中使圖像和聲音資源可用,您需要做的就是將它們添加到Xcode項目中; Xcode然后在庫窗格中列出它們舞箍。當您連接到給定的資源文件時舰褪,Xcode在nib文件中記錄該連接。在加載時疏橄,nib加載代碼在項目包中查找該資源占拍,在構建時應該由Xcode放置略就。

加載包含圖像和聲音資源引用的nib文件時,nib加載代碼盡可能高速緩存資源晃酒,以便以后輕松檢索表牢。例如,加載nib文件后贝次,您可以使用NSImage或UIImage(取決于您的平臺)的imageNamed:方法檢索與該nib文件相關聯(lián)的映像崔兴。在OS X中,您可以使用NSSound的soundNamed:方法來檢索緩存的聲音資源蛔翅。

加載圖像資源

圖像資源通常用于大多數(shù)應用敲茄。即使非常簡單的應用程序使用圖像來創(chuàng)建自定義外觀的控件和視圖。 OS X和iOS為使用Objective-C對象處理圖像數(shù)據(jù)提供廣泛的支持山析。這些對象使得使用圖像圖像非常容易堰燎,通常只需要幾行代碼來加載和繪制圖像。如果您不想使用Objective-C對象笋轨,還可以使用Quartz使用基于C的界面加載圖像秆剪。以下部分描述使用每種可用技術加載圖像資源文件的過程。

在Objective-C中加載圖像

要在Objective-C中加載圖像爵政,可以使用NSImage或UIImage對象仅讽,具體取決于當前平臺。使用AppKit框架為OS X構建的應用程序使用NSImage對象加載圖像并繪制它們茂卦。為iOS構建的應用程序使用UIImage對象何什。在功能上组哩,當涉及到加載現(xiàn)有圖像資源時等龙,這兩個對象都提供了幾乎相同的行為。通過將對象指針指向應用程序包中的圖像文件來初始化對象伶贰,并且圖像對象負責加載圖像數(shù)據(jù)的詳細信息蛛砰。

清單3-1顯示了如何使用OS X中的NSImage類加載映像資源。找到映像資源(在這種情況下在應用程序包中)時黍衙,只需使用該路徑初始化映像對象泥畅。初始化后,您可以使用NSImage的方法繪制圖像琅翻,或將該對象傳遞給可以使用該對象的其他方法位仁。要在iOS中執(zhí)行完全相同的任務,您需要做的只是將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提供了定位圖像資源并將相應的圖像數(shù)據(jù)加載到內存中的初始支持励七。 Quartz將您加載到內存中的圖像數(shù)據(jù)轉換為可用的CGImageRef,然后您的代碼可以用來繪制圖像奔缠。

使用Quartz加載圖像有兩種方法:數(shù)據(jù)提供者和圖像源對象掠抬。數(shù)據(jù)提供者可以在iOS和OS X中使用。圖像源對象僅在OS X v10.4及更高版本中可用校哎,但利用Image I / O框架來增強數(shù)據(jù)提供者的基本圖像處理能力两波。當涉及到加載和顯示圖像資源時,這兩種技術都非常適合這項工作闷哆。只有當您希望更好地訪問與圖像相關的數(shù)據(jù)時腰奋,您才可能喜歡數(shù)據(jù)提供者的圖像源。

清單3-2顯示了如何使用數(shù)據(jù)提供者加載JPEG圖像抱怔。此方法使用Core Foundation捆綁支持來定位應用程序主包中的圖像劣坊,并獲取其中的URL。然后使用該URL創(chuàng)建數(shù)據(jù)提供者對象屈留,然后為相應的JPEG數(shù)據(jù)創(chuàng)建一個CGImageRef局冰。 (為了簡潔起見,此示例省略了任何錯誤處理代碼灌危,您自己的代碼應確保任何引用的數(shù)據(jù)結構都有效)

清單3-2使用數(shù)據(jù)提供者加載映像資源

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編程指南。有關數(shù)據(jù)提供者的參考信息勇蝙,請參閱Quartz 2D參考集合(OS X)或Core Graphics Framework Reference(iOS)沫勿。

在iOS中指定高分辨率圖像

iOS應用程序應包含高分辨率版本的圖像資源。當應用程序在具有高分辨率屏幕的設備上運行時味混,高分辨率圖像提供額外的細節(jié)产雹,并且看起來更好,因為它們不需要縮放以適應空間翁锡。您可以為應用程序包中的每個圖像資源提供高分辨率圖像蔓挖,包括圖標和啟動圖像。

要指定圖像的高分辨率版本盗誊,請創(chuàng)建一個版本时甚,其寬度和高度(以像素為單位)是原始圖像的兩倍隘弊。您可以使用圖像中的額外像素來提供更多細節(jié)。保存圖像時荒适,使用相同的基本名稱梨熙,但在基本文件名和文件擴展名之間包含字符串@ 2x。例如刀诬,如果您有一個名為MyImage.png的圖像咽扇,高分辨率版本的名稱將是MyImage@2x.png。將圖像的高分辨率和原始版本放在應用程序包中的相同位置陕壹。

當?shù)讓釉O備具有高分辨率屏幕時质欲,捆綁和圖像加載程序將自動查找?guī)в蠤 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的映像剖毯。系統(tǒng)自動確定哪個版本的圖像最合適并加載。類似地缤苫,當使用或繪制該圖像時速兔,您不必知道它是原始分辨率還是高分辨率版本。圖像繪制程序根據(jù)加載的圖像自動調整活玲。但是,如果您仍然想知道圖像是原始還是高分辨率版本谍婉,您可以檢查其縮放因子舒憾。如果圖像是高分辨率版本,它的比例因子被設置為不是1.0的值穗熬。

有關如何支持高分辨率設備的更多信息镀迂,請參閱在視圖中支持高分辨率屏幕。

數(shù)據(jù)資源文件

將應用程序的數(shù)據(jù)與代碼分離可以使以后更容易修改應用程序唤蔗。如果將應用程序的配置數(shù)據(jù)存儲在資源文件中探遵,則可以更改該配置窟赏,而無需重新編譯應用程序。數(shù)據(jù)資源文件可用于存儲任何類型的信息箱季。以下部分突出顯示了iOS和OS X支持的一些數(shù)據(jù)資源類型涯穷。

屬性列表文件

屬性列表文件是在應用程序代碼之外存儲自定義配置數(shù)據(jù)的一種方式。 OS X和iOS廣泛地使用屬性列表來實現(xiàn)功能藏雏,如用戶首選項和捆綁包的信息屬性列表文件拷况。您可以類似地使用屬性列表來存儲應用程序的私有(或公開)配置數(shù)據(jù)。

屬性列表文件本質上是一組結構化數(shù)據(jù)值掘殴。您可以以編程方式或使用屬性列表編輯器應用程序(位于/ Developer / Applications / Utilities)中創(chuàng)建和編輯屬性列表赚瘦。自定義屬性列表文件的結構完全取決于您。您可以使用屬性列表來存儲字符串奏寨,數(shù)字起意,布爾值,日期和原始數(shù)據(jù)值病瞳。默認情況下杜恰,屬性列表將數(shù)據(jù)存儲在單個字典結構中,但您可以將其他字典和數(shù)組分配為值以創(chuàng)建更多分層數(shù)據(jù)集仍源。

有關使用屬性列表的信息心褐,請參閱“Core Foundation”的“屬性列表編程指南”和“屬性列表編程主題”。

OS X數(shù)據(jù)資源文件

表4-1列出了Mac應用程序支持的其他資源文件類型笼踩。

表4-1其他資源類型

資源類型
描述
AppleScript文件
在OS X中逗爹,AppleScript術語和套件文件包含有關應用程序可腳本性的信息。 這些文件可以使用文件擴展名.sdef嚎于,.scriptSuite或.scriptTerminology掘而。 因為用于腳本應用程序的實際AppleScript命令在用戶腳本和腳本編輯器應用程序中可見,因此需要對這些資源進行本地化于购。 有關支持AppleScript的信息袍睡,請參閱AppleScript概述。

幫助文件

在OS X中肋僧,幫助內容通常由使用標準文本編輯程序創(chuàng)建并在Help Viewer應用程序中注冊的一組HTML文件組成斑胜。 (有關如何使用幫助查看器注冊的信息,請參閱Apple幫助編程指南嫌吠。)也可以將PDF文件止潘,RTF文件,HTML文件或其他自定義文檔嵌入到您的軟件包中辫诅,并使用外部應用程序打開它們凭戴,如預覽 或Safari。 有關如何打開文件的信息炕矮,請參閱Launch Services編程指南么夫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末者冤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子档痪,更是在濱河造成了極大的恐慌涉枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞它,死亡現(xiàn)場離奇詭異拜银,居然都是意外死亡,警方通過查閱死者的電腦和手機遭垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門尼桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锯仪,你說我怎么就攤上這事泵督。” “怎么了庶喜?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵小腊,是天一觀的道長。 經(jīng)常有香客問我久窟,道長秩冈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任斥扛,我火速辦了婚禮入问,結果婚禮上,老公的妹妹穿的比我還像新娘稀颁。我一直安慰自己芬失,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般航攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挤渔,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死芭析,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吞瞪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驾孔,長吁一口氣:“原來是場噩夢啊……” “哼芍秆!你這毒婦竟也來了惯疙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤妖啥,失蹤者是張志新(化名)和其女友劉穎霉颠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆虱,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蒿偎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诉位。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菜枷,靈堂內的尸體忽然破棺而出苍糠,到底是詐尸還是另有隱情,我是刑警寧澤啤誊,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布岳瞭,位于F島的核電站,受9級特大地震影響蚊锹,放射性物質發(fā)生泄漏瞳筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一牡昆、第九天 我趴在偏房一處隱蔽的房頂上張望姚炕。 院中可真熱鬧,春花似錦迁杨、人聲如沸钻心。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捷沸。三九已至,卻和暖如春狐史,著一層夾襖步出監(jiān)牢的瞬間痒给,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工骏全, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苍柏,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓姜贡,卻偏偏與公主長得像试吁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容