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編程指南。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容