




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、聲音和到目前為止,說上一章中的山峰圖像,但是編程的焦點(diǎn)主要集中在文本上。沒錯(cuò),只使用了最簡單的方式。顯示過UIImage,比如實(shí)際上能提供更豐富、更引人入勝的體驗(yàn)。照相機(jī)、麥克風(fēng)、完善的庫和揚(yáng)聲器是詳細(xì)介紹圖內(nèi)置在中的一些工具。本章這些特性作為多常規(guī)內(nèi)容來介紹。像,并簡要介紹更復(fù)雜介紹。對于更復(fù)雜的器以及在上聲音。超出了本書范疇。處理,圖像編輯的留到下一章介紹指引你去參考相關(guān)的大量Apple的庫時(shí)再做。18.1圖像介紹已經(jīng)幾次涉及圖像使用,最早出現(xiàn)在第12章中,在第一個(gè)SDK例子中包含了圖像。還總是在 erfaceBuilder中創(chuàng)建UIImageView,將其附加到文件名,且無需考慮細(xì)節(jié)?,F(xiàn)
2、在要考慮細(xì)節(jié)了。要來看Xcode中可用的一些選項(xiàng),而不是依賴于 erface Builder的高度抽象。 深入到細(xì)節(jié)中,你會發(fā)現(xiàn)使用圖像的過程分為兩步。首先是將數(shù)據(jù)加載到UIImage中,然后通過一些方式使用UIImage??赏ㄟ^兩種主要的方式來使用UIImage,如圖18-1所示。圖18-1 圖像可以顯示在UIImageView或UIView中本節(jié)來探討比較簡單的使用UIImageView來顯示圖像的方法,18.2節(jié)將探討更為復(fù)雜的將圖像繪制到UIView后層的方式。本章內(nèi)容和操作圖像使用照相機(jī):圖像和聲音第 18章 18.1圖像介紹27318.1.1加載UIImageUIImage類提供7
3、種不同的方式創(chuàng)建圖像實(shí)例。其中的4個(gè)工廠方法可能最容易使用,參見表18-1。還有一些與之等同的init方法,你可以根據(jù)自己的喜好來使用。表18-1用于創(chuàng)建UIImage的工廠方法工廠方法概述imageNamed:imageWithCGImage: imageWithContentsOfFile:基于主包(main bundle)中的文件創(chuàng)建UIImage從Quartz 2D對象創(chuàng)建UIImage,這與initWithCGImage:相同從你指定的完整文件路徑創(chuàng)建UIImage,跟第16章中initWithContentsOfFile:相同從NSData創(chuàng)建UIImage,這與initWithD
4、ata:相同的一樣,這與imageWithData:圖像數(shù)據(jù)可以是幾種文件類型,包括BMP、CUR、GIF、JPEG、PNG和TIFF。本書中使用得最多的是JPEG(因?yàn)樗鼈儽容^?。┖蚉NG(因?yàn)樗鼈冊谟布虾每?,且被加速)。也可以從Quartz 2D對象創(chuàng)建UIImage,這是的基本圖形程序包,下一章將會介紹。創(chuàng)建UIImage時(shí)有一個(gè)隱含的限制:圖像不應(yīng)該大于10241024。只要將圖像導(dǎo)入程序中,就可以顯示了。如果只愿意使用UIKit的簡單方法,就會想要使用UIImageView類來顯示圖像。18.1.2繪制UIImageView在顯示時(shí)已經(jīng)在程序中使用過UIImageView?,F(xiàn)在要來
5、其工作的細(xì)節(jié)。有兩種方式初始化UIImageView。首先,可以使用initWithImage:方法,它允許你傳遞一個(gè)UIImage,如下所示:另外,也可以使用基本的initWithFrame:方法,并手動修改對象的屬性。表18-2展示了一些屬性和方法,你對UIImageView做表18-2工作時(shí)很可能會用到它們。18UIImageView的一些屬性和方法方法或?qū)傩灶愋透攀鯽nimationDuration animationImages animationRepeatCount imagestartAnimatingstopAnimating屬性屬性屬性屬性方法方法指定多長時(shí)間運(yùn)行一次動畫循
6、環(huán)識別圖像的NSArray,以加載到UIImageView中指定運(yùn)行多少次動畫循環(huán)識別單個(gè)圖像,以加載到UIImageView中開啟動畫停止動畫274第 18 章:圖像和聲音要加載普通圖像,可以使用image屬性,但是幾乎沒有理由使用它而不使用initWithImage:方法除非你在動態(tài)改變圖像。如果想要創(chuàng)建一組圖像作為動畫,那么有必要利用其他UIImage- View方法和屬性??梢詫⒁唤M圖像加載到UIImageView中,它們應(yīng)該多長時(shí)間完成一次動畫循環(huán)及運(yùn)行的次數(shù),并在你覺得合適的時(shí)候開始和停止循環(huán)。代碼18-1中展示了一個(gè)簡單的例子。加載圖像創(chuàng)建UIView開啟動畫你可能想要手動加載圖
7、像,而不是通過 erface Builder進(jìn)行加載,其中一個(gè)主要原因是為了利用UIImageView的動畫功能。18.1.3在 UIKit 中修改圖像已經(jīng)介紹了如何以編程方式創(chuàng)建圖像并將它們加載到圖像視圖中。很顯然,接下來的事情就是開始修改圖像。不幸的是,在處理UIImageView時(shí)只有有限的能力修改圖像??梢曰谝晥D的一些簡單操作,做一些改變。例如,如果你調(diào)整UIImageView的大小,則它將自動調(diào)整其包含的的大小。同樣,通過設(shè)置UIImageView的框而不是整個(gè)屏幕,來決定在哪里繪制UIImageView。你甚至可以通過使用多個(gè)UIImageView來分層多個(gè)圖像。這一切很快就會變
8、得笨重,而且你不能做任何更有趣的事情,比如說通過混合或alpha透明選項(xiàng)來變換圖像或修改它們的堆放形式。要做這類工作(并開始堆放,而不只是堆放視代碼18-1 UIImageView允許動畫循環(huán)圖像18.2利用 Core Graphics 繪制簡單圖像275圖),需要了解Core Graphics。UIImage提供一些簡單的方式Core Graphics功能,無需去往Core Graphics框架(或者了解上下文或者其底層的其他復(fù)雜情況)。這里將簡要介紹這些內(nèi)容,但是Core Graphics基本上要等到下一章才介紹,那時(shí)主要介紹整個(gè)的Quartz 2D圖形引擎。18.2利用 Core Gra
9、phics 繪制簡單圖像盡管不能具有變換和其他復(fù)雜功能的整個(gè)Core Graphics庫,但是UIImage類卻包含5個(gè)簡單的方法,可以充分利用Core Graphics的工作方式。表18-3中描述了這些方法。表18-3用于繪制UIImage的實(shí)例方法方法概述drawAsPatternInRect:在矩形中繪制圖像,不縮放,但是在必要時(shí)平鋪drawAtPodrawAtPo:blendMode:alpha:利用CGPo作為左上角,繪制完整的不縮放的圖像drawAtPo:的一種更復(fù)雜的形式在CGRect中繪制完整的圖像,適當(dāng)?shù)乜s放drawInRect:的一種更復(fù)雜的形式drawInRect:dra
10、wInRect:blendMode:alpha:問題是,這些方法不能用作viewDidLoad:的一部分或者通常用來加載對象的任何其他方法的一部分。這是因?yàn)樗鼈円蕾囉趫D形上下文而工作。下一章更詳細(xì)地談?wù)撋舷挛?,但是圖形上下文其實(shí)就是你所繪制的東西要到達(dá)的目標(biāo),比如說窗口、PDF文件或者。在上,UIView自動創(chuàng)建圖形上下文作為其CALayer的一部分,CALayer是與每個(gè)UIView相關(guān)的Core Animation層??梢酝ㄟ^為UIView(或者更確切地說,為你已經(jīng)創(chuàng)建的新的子類)編寫drawRect:方法來Core Animation層。要做這種類型的工作,通常必須獲得一個(gè)特殊的上下文變
11、量,UIView方法替你去做這件事,這樣事情就變得簡單了。代碼18-2展示了如何使用該方法拼合一些。18注意,drawAtPo:方法讓你可以完成更復(fù)雜的事情,比如說混合(使用類似于Photoshop的選項(xiàng),比如顏色減淡和強(qiáng)光)和讓變得有些透明。這里使用的是普通混合,但是只有50%的(因此使用drawAtPo:方法)。其余代碼很標(biāo)準(zhǔn)。使用這些單個(gè)繪圖命令代碼18-2 UIView的drawRect:允許你使用較低級別的繪圖命令276第 18 章:圖像和聲音非常簡單,比費(fèi)力去創(chuàng)建多個(gè)UIImageView對象簡單多了(可能還更為高效)。的Core Graphics框架之前,在深入研究還有好多事情不
12、能做,但是現(xiàn)在已經(jīng)得到一些控件,已經(jīng)足夠滿足大多數(shù)常見的多下一章。需求了。如果需要的控件,請直接跳轉(zhuǎn)到談?wù)撨^很多有關(guān)圖像的話題,但是一直假設(shè)你是從項(xiàng)目的包加載圖像。而如果你想讓用戶來選擇呢?這就是下一節(jié)的。18.3可以使用SDK從的庫或相機(jī)卷。也可以允許用戶拍攝新。這都是用UIImagckerController完成的,它是另一個(gè)模式控制器,負(fù)責(zé)管理一個(gè)相當(dāng)復(fù)雜的圖形界面,無需你的干預(yù)。圖18-2顯示了它的樣子。圖18-2 圖像選取器是另一個(gè)供你使用的預(yù)編程的控制器18.3.1使用圖像選取器通過創(chuàng)建對象、設(shè)置一些變量并將它呈現(xiàn)為模式視圖控制器來加載UIImagckerController。默認(rèn)
13、情況下,圖像選取器控制器將允許用戶(以及有選擇性地編輯)他們的庫中的:一旦創(chuàng)建了圖像選取器控制器,你就需要有其委托來響應(yīng)以下兩個(gè)方法的委托響應(yīng):image-PickerController:didFinishPickingImage:editingInfo: 和imagckerController-18.3277DidCancel:。對于第一個(gè)方法,你應(yīng)該解散模式視圖控制器,并適當(dāng)?shù)仨憫?yīng)用戶的而對于第二個(gè)方法,則只需要解散控制器。選擇??傊?,圖像選取器控制器很容易使用,因?yàn)槟阒饕菍Ρ贿x中的了一個(gè)使用它的完整例子。做出反應(yīng)。下一節(jié)給出18.3.2拍照前面提到過,UIImagckerContro
14、ller具有三個(gè)可能的源,由以下常量表示:UIImagUIImagckerControllerSourceTypePhotoLibrary,庫中的一個(gè)。ckerControllerSourceTypeSavedPhotosAlbum,相機(jī)卷中的一個(gè)。UIImagckerControllerSourceTypeCamera,照相機(jī)拍攝的新。應(yīng)該總是確保,在啟動圖像選取器控制器之前,源是可用的,盡管這對于照相機(jī)來說最重要??梢杂胕sSourceTypeAvailable:類方法確定源的存在:一旦驗(yàn)證了源的存在,你就可以告訴圖像選取器,結(jié)合sourceType屬性一起使用這個(gè)源。例如,要使用照相機(jī),
15、可以這樣做:注意,一個(gè)程序中拍攝的必須將它們保存到那里(只在該程序中可用。如果你想要這些進(jìn)入相冊,那么程序馬上就會到)。在測試期間曾幾次讓它停下來。起碼這意味著,以的經(jīng)驗(yàn),照相機(jī)是很占用資源的你在使用照相機(jī)的時(shí)候需要考慮保存程序的狀態(tài),因?yàn)槭褂谜障鄼C(jī)會導(dǎo)致內(nèi)存不夠用。18.4節(jié)中的例子中就會用到照相機(jī)。18.3.3保存到相冊你可能希望將新保存到相冊,或者希望將程序創(chuàng)建的圖形存放到相冊。不管出于哪種情況,都使用UIImageWriteToSavedPhotosAlbum函數(shù)。該函數(shù)具有4個(gè)變量:第一個(gè)列出圖像,其他三個(gè)一個(gè)可選的異步通知函數(shù),以在完成保存時(shí)調(diào)用。通??梢韵裣旅孢@樣調(diào)用該函數(shù):18
16、如果你想要利用異步通知,請查閱UIKit函數(shù)參考,那里解釋了該函數(shù),或者也可以參考下一章的例子??梢允褂迷摵瘮?shù)將UIView的CALayer保存到相冊,例如,相冊允許你保存那些你以前直接寫到CALayer的繪圖命令。這也同樣依賴于圖形上下文,下一章么做這件事:會解釋,但是這里要展示怎278第 18 章:圖像和聲音為了該函數(shù)正確工作,你必須到Quartz Core框架?,F(xiàn)在已經(jīng)介紹了圖像的所有基本知識,可以將它們組合到本章的“大”例子中了,這個(gè)例子是一個(gè)程序,它拼合多個(gè),首先是利用UIImagckerController選擇這些,然后利用UIImageView允許它們移動,最后將它們繪制到一個(gè)C
17、ALayer中以便保存。18.4拼合:一個(gè)圖像例子拼合(collage)程序依賴于三個(gè)對象。跟往常一樣,collageViewController完成大部分工作。它寫出到collageView對象,該對象主要作為一個(gè)CALayer存在。最后,你將有一個(gè)tempImageView對象,它是用戶在圖像被選中但是沒有放置之前臨時(shí)放置圖像的地方。18.4.1拼合視圖控制器拼合視圖控制器建立在一些 erface Builder對象之上,這些對象是:視圖控制器本身;一個(gè)叫做myTools的工具,它在編程過程中將被填充;collageView UIView類,它作為自己的類文件而存在,并作為self.vie
18、w 到程序中。你還需要向項(xiàng)目中添加Quartz Core框架,因?yàn)槟銓⑹褂脛偛诺谋4婕记?。代碼18-3展示了完整的視圖控制器,這是整個(gè)程序中作用最大的文件。代碼18-3 視圖控制器負(fù)責(zé)大部分的拼合任務(wù)18.4拼合:一個(gè)圖像例子279設(shè)置對象激活圖像選取器18280第 18 章:圖像和聲音激活照相機(jī)響應(yīng)圖像選擇響應(yīng)選取器取消調(diào)整大小將添加到CALayer18.4拼合:一個(gè)圖像例子281保存拼合伸縮圖像代碼有點(diǎn)長,但是很容易理解。一開始是viewDidLoad:,它設(shè)置UIToolBar。早就贊美過 erface Builder,但是也,在創(chuàng)建更加動態(tài)的項(xiàng)目時(shí),它可能會以勝任。這里就是這種情況。你
19、不能在 erface Builder中有效地填充UIToolBar,因?yàn)槟銓⒒诔绦虻臓顟B(tài)改變它。你要在sav上放置按鈕以調(diào)用三個(gè)方法:choosc:、takc:(當(dāng)照相機(jī)可用時(shí))和c:。choosc:和takc:是類似的方法。它們都調(diào)用圖像選取器控制器,但是第一個(gè)方法庫,第二個(gè)方法讓用戶拍攝新。這些模式控制器的非凡之處在于,從你創(chuàng)建選取器18到用戶選擇當(dāng)用戶選擇或者取消,這期間無需你做任何事情。時(shí),imagckerControl:didFinishPickingImage:editingInfo會被調(diào)用 ,將控制返回給程序。這里你要做以下4件事情。解散模式視圖控制器。查看交給你的,調(diào)整大小,
20、以填滿四分之一或更少的屏幕。將圖像實(shí)例化為一個(gè)tempImageView對象,該對象是UIImageView的子類。改變,以便有一個(gè)Done按鈕可用,還有一個(gè)滑塊。此時(shí),用戶能夠做以下3件事情。使用UITouch移動圖像視圖(圖像視圖包括在tempImageView類中,因?yàn)檫@是觸摸發(fā)生的282第 18 章:圖像和聲音地方,就像使用滑塊改變在第14章中看到的一樣)。大小。單擊Done按鈕接受圖像大小和位置。產(chǎn)生的最終結(jié)果如圖18-3所示。注意,如果用戶取消了圖像選取器,那么你的imageP-ickerControllerDidCancel:方器 。正確地關(guān)閉模式控制UISlider 被掛接到r
21、escalc: 方法。它重新繪制 UIImageView的框,這將在自動調(diào)整大小。同時(shí),Done按鈕激活finishPic:方法 。這會發(fā)送一個(gè)特殊的addPic: at:消息給collageView。CALayer繪制就是在collageView中完成的,馬上就會返回來介紹它。finishPic: 也解散UISlider和tempImageView,并重新設(shè)置置?;氐匠跏荚O(shè)還有一個(gè)還沒介紹的按鈕:Save。它激活初始savc:方法 ,該方法將CALayer保存到庫。注意,該是UIView的中。圖18-3 使用拼合程序同時(shí)顯示很多方法在執(zhí)行過程中會臨時(shí)隱藏。由于子視圖,如果不這樣做的話,它會被
22、包含在最后一個(gè)方法scaleImage: 是設(shè)置每個(gè)圖像以填充大約四分之一屏幕的工具。代碼中有兩個(gè)不確定的部分:tempImageView中的方法(它們允許用戶移動UIImageView)和collageView中的方法(它們稍后將圖像繪制到CALayer中)。18.4.2拼合臨時(shí)圖像視圖tempImageView類只有一個(gè)目的:截取UITouch。UITouch表示用戶想要將新圖像移動到拼合的不同部分。代碼很簡單,如代碼18-4所示。代碼18-4 臨時(shí)圖像可通過觸摸被移動18.4拼合:一個(gè)圖像例子283確定在視圖中的位置計(jì)算整置這類似于你在第14章中編寫的觸摸代碼,無需做的解釋?;叵胍幌?,l
23、ocationInView:應(yīng)用程序的全局坐標(biāo)系統(tǒng)。仿真器)上時(shí),結(jié)果有時(shí)會超出邊界,給出視圖坐標(biāo)系統(tǒng)內(nèi)的一個(gè)CGPo在測試中發(fā)現(xiàn),當(dāng)運(yùn)行在,需要轉(zhuǎn)換成(而不是所以你在移動臨時(shí)圖像視圖之前,需要仔細(xì)檢查坐標(biāo)。18.4.3拼合視圖最后,具有了collageView本身,它是背景UIView,需要響應(yīng)addPic:at:消息并用drawRect:繪制到CALayer上。代碼18-5展示了做這件事的代碼。保存到數(shù)組中18代碼18-5 一旦設(shè)置一個(gè)圖像,背景視圖就會管理低級別的繪制284第 18 章:圖像和聲音繪制到CALayer上該代碼分為兩部分。addPic:at:方法 將其信息保存到一個(gè)實(shí)例變量
24、中,將myPics詞典添加到NSMutableArray。注意,你必須將值轉(zhuǎn)換為NSNumber,以便可以將它們放置到詞典中。該方法然后在視圖上調(diào)用setNeedsDisplay。應(yīng)該從來不直接調(diào)用drawRect:。相反,當(dāng)想要它執(zhí)行時(shí),可調(diào)用setNeedsDisplay方法,其他所有事情都不用你操心。drawRect:后來很快就被調(diào)用 。它到的技術(shù)將每個(gè)圖像繪制到CALayer上。整個(gè)NSMutableArray,將之分解,并用前面學(xué)習(xí)還沒有展示頭文件和未更改的應(yīng)用程序委托,但是這是編寫完整的拼合程序都需要的重要內(nèi)容。18.4.4擴(kuò)展這個(gè)例子這是較長的例子之一,但是仍然需要進(jìn)行一些擴(kuò)展,
25、才能變成功能全面的應(yīng)用程序。首先,它對內(nèi)存有點(diǎn)不友好。如果能文件名,而不是到處使用UIImage,那么可能會更好。此外,CALayer所來自的NSArray應(yīng)該保存到文件,以便在內(nèi)存不夠時(shí)不會丟失。但是程序只要存在就應(yīng)該工作得很好。程序應(yīng)該變得更加可用。裁剪的選項(xiàng)很好,但是可能需要Core Graphics函數(shù)。一個(gè)在鎖定之后移動的選項(xiàng)相對簡單:你可以在collageView中測試觸摸,并向后NSArray,以找到用戶正在觸摸哪個(gè)對象。將它重新實(shí)例化為UIImageView很簡單。不管怎樣,已經(jīng)展示了所有這些圖形基本要素如何一起工作,現(xiàn)在開始介紹多的另外兩種主要類型:音頻和。18.5使用 Me
26、dia Player 框架音頻和都比圖像更加復(fù)雜。幸運(yùn)的是,有一個(gè)高級別框架Media Player允許你18.5使用 Media Player 框架285音頻和。如果你不需要音頻或緊密地集成到應(yīng)用程序的其余部分中,那么它是一個(gè)很好的選擇對于通常工作得很好,但是對于音頻是一個(gè)不太理想的選擇。Media Player框架包含兩個(gè)類:MPMoviePlayerController和MPVolumeView。它們管理整個(gè)頁面的音頻或要使用任何一個(gè)MediaPlayer h頭文件。器,無需你控制其如何工作,但是讓你很容易音頻或文件。器類,你都應(yīng)該向你的項(xiàng)目添加Media Player框架和MediaP
27、layer/器類器,你需要用將要調(diào)用的文件的URL字符串初始化一個(gè)MPMoviePlayer-18.5.1為了使用Controller對象。這可能是任何 mp3、.mp4、.mov或.3gp文件,或者是支持的任何其他東西。啟動器的方式有兩種,可以立即(這會導(dǎo)致后再啟動。的轉(zhuǎn)盤旋轉(zhuǎn)得快一點(diǎn),當(dāng)它做好準(zhǔn)備時(shí)),或者等到接收了文件已加載有三個(gè),表18-4中描述了它們。使用器時(shí)你需要注意表18-4 告訴你器正在做什么通知概述MPMoviePlayerContentPreloadDidFinishNotification文件已加載重放完成MPMoviePlaylaybackDidFinishNotifi
28、cation(續(xù))通知概述MPMoviePlayerScalingModeDidChangeNotification器的縮放模式改變1. 調(diào)用代碼器18-6顯示了器的一個(gè)簡單調(diào)用。該程序的構(gòu)造開始于erface Builder中,包括一個(gè)UITextField(用于URL的輸入)、一個(gè)UILabel(用于IndicatorView(在加載期間展示活動)。它依賴于通知來狀態(tài)和錯(cuò)誤)和一個(gè)UIActivity-器是如何工作的。準(zhǔn)備文本字段18解散鍵盤代碼18-6器的一個(gè)簡單調(diào)用286第 18 章:圖像和聲音加載文件設(shè)置器啟動器請求通知安撫用戶在加載完成時(shí)開始在完成時(shí)刷新屏幕你的項(xiàng)目開始很簡單,就是
29、設(shè)置UITextField。這涉及設(shè)置Return鍵法textFieldShouldReturn: ,前面已經(jīng)這么做過好幾次了。和編寫它的主委托方項(xiàng)目是從文本字段真正開始的。當(dāng)文本數(shù)據(jù)被輸入時(shí),chooseFile:方法被調(diào)用 ,就是該方法加載器。假設(shè)你被傳遞一個(gè)URL(因?yàn)樗唵?,曾?jīng)使用過,盡管馬上就會討論本地文件),將之轉(zhuǎn)換成NSURL,然后創(chuàng)建器 。有少量的屬性可以設(shè)置來指定器如何工作 ,這些屬性都列出在類參。你使用前面看到的過程到器中 。讓用戶知道你怎樣進(jìn)行處理是個(gè)不錯(cuò)的主意,所以最后幾行代碼更新狀態(tài)信息并啟動一個(gè)活動指示器,表示正在進(jìn)行處理中 。一旦文件被加載,movieDidLo
30、ad:方法就會被通知 。它清除你的更新信息,然后器開始。跟面章節(jié)中看到的模式視圖控制器一樣,此時(shí)由器負(fù)責(zé),直到其額外回來之前無需你操心任何事情。在本例中,當(dāng)它完成之后 ,你做一些最后的清除。2. 從文件加載如果你愿意從文件而不是從互聯(lián)網(wǎng)加載,你就可以包含文件作為包的一部分。使用在第16章中方法創(chuàng)建NSURL:的方法,創(chuàng)建一個(gè)到這些本地文件的路徑,并且用fileURLWithPath:工廠18.5使用 Media Player 框架287在編寫本書時(shí),加載文件比從互聯(lián)網(wǎng)加載更為可靠。從互聯(lián)網(wǎng)加載時(shí),音樂文件偶爾會無緣由地被破壞,流似乎根本不能工作。期望這些問題很快得到糾正,可能就在本書之際。器還
31、支持另一個(gè)功能:你可以允許用戶在器之外設(shè)置音量。18.5.2音量視圖通過調(diào)用MPVolumeView條目,你可以允許用戶調(diào)整音量,調(diào)用方法如下:你不需要做任何工作,當(dāng)用戶更改音量控件時(shí),系統(tǒng)音量將立即更改。如果你愿意使用另外的方法,有三個(gè)一般函數(shù)可用來調(diào)用音量警報(bào)。參見表18-5。表18-5用警報(bào)設(shè)置音量函數(shù)概述MPVolumeSettingsAlertShow MPVolumeSettingsAlertHideMPVolumeSettingsAlertIsVisible顯示音量警報(bào)隱藏音量警報(bào)返回一個(gè)布爾值,以顯示音量警報(bào)的狀態(tài)在一起,而一旦你加載了Media Player注意,這些是函數(shù),
32、不是方法。它們不與任何類框架,則這些函數(shù)通常是可用的。警告在編寫本書時(shí),音量控制在仿真器中不起作用。18.5.3更好地集成器最大到程序中。器是,它調(diào)用一個(gè)單獨(dú)的屏幕。因此,很難用它將音樂或直接集成18對于音樂來說,這個(gè)問題目前還難以一下子就解決了。如圖18-4所示,當(dāng)音樂時(shí),屏幕被一個(gè)大的QuickTime標(biāo)志占據(jù)著。希望,SDK的未來版本能夠給予你選項(xiàng),來定義播放聲音時(shí)的背景(或者更好一點(diǎn),允許你保持在普通視圖中,從而能夠真正集成音頻功能)。器的288第 18 章:圖像和聲音圖 18-4是控件,因?yàn)楫?dāng)你將用作cut scene時(shí),不希望用戶操作對于來說,最大它。通過將MPMoviePlaye
33、rController的movieControlMode屬性設(shè)置為 MPMovieControl-ModeVolumeOnly(這只允許使用音量控件)或者M(jìn)PMovieControlModeHidden(這不允許用戶任何控件),可以解決這個(gè)問題。有了這種隱藏控件的能力,器應(yīng)該成了你顯示所需要的工具,但是它還是不能使用音頻,迫使你去尋求另外的方法。不幸的是,還沒有高級別的框架用于音頻,所以你自己必須做不少的工作。大量具體的細(xì)節(jié)由于比較復(fù)雜,超出了本書范疇,但是器之外的處理音頻所用最簡單方法開始介紹。從18.6手動沒有用于是,Celestial是對外部的開發(fā)聲音音頻的高級別框架這種說法并不完全正確
34、。確實(shí)有,叫做Celestial。不幸的上的很多“私有框架”之一,這意味著它已在Apple,但是還沒有方法,因?yàn)樗接锌蚣芸捎?。決定在本書中不用來私有框架的隨時(shí)可能改變,使用它們會讓程序很容易受到OS升級的影響。相反,供的框架。需要依靠Apple提有很多提供的框架!的Core Audio系統(tǒng)包含半打以上的框架,讓你可以在低級別音頻文件。這些框架包括Audio Queue Servi、Audio File Stream Servi、Audio FileServi&、OpenAL、Audio SesServi等。要深入了解這些框架,請參考Apple參考庫的“Audio”部分,從“Getting St
35、arted wiudio &” 和“Core Audio Overview”開始。這些框架都足夠老了,還沒有脫離Core Foundation,所以你必須依賴于從這些較老的編程風(fēng)格中學(xué)到的經(jīng)驗(yàn)。只簡要介紹音頻。于更復(fù)雜的Audio Queue Servi提供一些關(guān)于如何簡單聲音和振動的例子,但是對,概述過程,并將你引向關(guān)于該的Apple擴(kuò)展。簡單聲音18.6.1System Sound Servi是一個(gè)C接口,它讓你。它是Audio Toolbox簡單聲音和振動??蚣艿囊徊糠?,在AudioToolbox/AudioServi.h中18.6手動聲音289該接口只可以用來30秒以下的.aif、.c
36、af或.wav格式的短音頻文件。要使用System SoundServi,則從文件創(chuàng)建一個(gè)系統(tǒng)聲音ID,可選地為聲音完成時(shí)創(chuàng)建一個(gè)回調(diào),并啟動它。表18-6展示了主要的函數(shù)。表18-6System Sound Servi的主要函數(shù)函數(shù)參數(shù)概述AudioServiAudioServi AudioServiceCreateSystemSoundIDURL、&從URL創(chuàng)建聲音完成時(shí)刪除聲音DiseSystemSoundIDpletion、run loop、run loop mode、routine、data為聲音完成一個(gè)回調(diào)AudioServiAudioServiRePlaySystemSoundp
37、letion完成時(shí)刪除回調(diào)聲音有一些額外的函數(shù)處理系統(tǒng)聲音屬性,可以在System Sound Servi代碼18-7展示了如何使用最重要的函數(shù)。參找到這些函數(shù)。準(zhǔn)備URL創(chuàng)建聲音添加回調(diào)18聲音清除聲音器一樣,啟用System Sound Servi接口首先是構(gòu)建一個(gè)到文件的路徑(使用在跟第16章中學(xué)到的知識),然后將其轉(zhuǎn)換成一個(gè)URL。完成之后,就可以創(chuàng)建系統(tǒng)聲音了 ,這代碼18-7 Audio Toolbox支持簡短音頻的290第 18 章:圖像和聲音要求將NSURL *橋接到CFURLRef并傳遞一個(gè)指向系統(tǒng)聲音ID的指針。添加回調(diào)函數(shù)是可選的 ,但是如果你想要在聲音完成時(shí)發(fā)生一些事情
38、,則一定要這么做。一旦有了系統(tǒng)聲音ID,這里做的一樣。就很簡單了 ,但是你應(yīng)該檢查系統(tǒng)聲音ID創(chuàng)建得是否正確,跟跟平常一樣,完成之后應(yīng)該清空內(nèi)存。這就是本例中回調(diào)函數(shù)所做的事情 。18.6.2振動System Sound Servi接口中還隱含著一個(gè)很酷的小特性,你可以使用它來振動用戶的。這通過傳遞一個(gè)預(yù)先定義的系統(tǒng)聲音ID來實(shí)現(xiàn),如代碼18-8所示。對于有時(shí)難以使用的音頻系統(tǒng)來說,這是它本身的簡易之處。的音頻工作,不幸的是,就只有這些了?,F(xiàn)在已經(jīng)介紹了所有容易結(jié)束之前,下面要概述不滿足System Sound Servi接口要求的音頻文件(可能是太長了,也可能是文件類型不符)時(shí)的操作步驟。復(fù)
39、雜長于30秒18.6.3要,需要依賴于Audio Queue Servi支持的有限音頻類型之外其他類型。它將允許你較長,播放System Sound Servi,甚至聲音。Apple提供兩組極好的關(guān)于Audio Queue Servi的代碼,你可以過來自己使用,所以這里就不贅述了?!癆pple Queue ServiProgramming Guide”提供了一個(gè)全面的例子,介紹如何在過程化的面向C的環(huán)境中編寫器?!癝peakHere”示例代碼展示了如何使用最初面象的Objective-C代碼執(zhí)行類似的任務(wù)。器出現(xiàn)在AudioPlayer m文件中。為了闡述Apple的示例代碼,表18-7列出了
40、復(fù)雜聲音需要遵循的標(biāo)準(zhǔn)步驟。它依賴于如下這些。音頻文件ID類似于前面遇到過的系統(tǒng)聲音ID,它指向文件的音頻內(nèi)容。音頻隊(duì)列包含大量緩沖區(qū)通常至少包含3個(gè)。這些緩沖區(qū)被填充了音頻內(nèi)容(通常來自文件),一次填充一個(gè),然后被分派給器(通常是揚(yáng)聲器)。音頻隊(duì)列緩沖區(qū)是通過隊(duì)列傳遞的單個(gè)聲音單元。每個(gè)音頻隊(duì)列緩沖區(qū)具有用戶設(shè)置的大小。你在用數(shù)據(jù)填充這些緩沖區(qū)時(shí)會給它們編制隊(duì)列,然后它們會按隊(duì)列進(jìn)行。音頻隊(duì)列回調(diào)是一個(gè)特殊的函數(shù),被調(diào)用來處理音頻隊(duì)列?;卣{(diào)發(fā)生在數(shù)據(jù)被拖入音頻隊(duì)列時(shí)。它需要填充緩沖區(qū),然后將它們編制隊(duì)列。定制音頻結(jié)構(gòu)是一個(gè)用戶創(chuàng)建的結(jié)構(gòu),其中包含回調(diào)需要知道的所有關(guān)于音頻文件狀態(tài)代碼18-8 振需要一行代碼18.6手動聲音291和隊(duì)列狀態(tài)的數(shù)據(jù)。它作為函數(shù)調(diào)用的一部分被傳遞給回調(diào)。圖18-5以圖形方式描述了這些概念。音頻緩沖區(qū)隊(duì)列回調(diào)輸入輸出緩沖區(qū)緩沖區(qū)緩沖區(qū)圖18-5 音頻從輸入設(shè)備移動到輸出設(shè)備以便進(jìn)行重放的管道圖有了這些定義之后,應(yīng)該就能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java面試題及答案2021
- 2025年海洋科學(xué)專業(yè)畢業(yè)生考試試題及答案
- oraclesql考試題及答案
- java面試題及答案四個(gè)人偷吃蘋果
- 設(shè)計(jì)原型的構(gòu)建方法及試題與答案
- 軟件測試中的性能評估試題及答案
- 軟件設(shè)計(jì)師考試面臨的挑戰(zhàn)試題及答案
- 項(xiàng)目實(shí)施過程中的合規(guī)審查試題及答案
- 網(wǎng)絡(luò)工程師關(guān)鍵能力測評試題及答案
- 解密考試規(guī)則的信息系統(tǒng)項(xiàng)目管理師試題及答案
- 2025-2030中國市政工程建設(shè)行業(yè)市場發(fā)展前瞻及投資戰(zhàn)略研究報(bào)告
- 2025年客戶體驗(yàn)管理:存量時(shí)代銀行的核心競爭力白皮書-瑞和數(shù)智
- 2025年醫(yī)保知識培訓(xùn)試題:醫(yī)?;颊邫?quán)益保障與醫(yī)療保險(xiǎn)報(bào)銷時(shí)限試卷
- 數(shù)據(jù)治理與數(shù)據(jù)質(zhì)量管理試題及答案
- 江蘇省南京玄武區(qū)十三中學(xué)集團(tuán)科利華2025屆七下生物期末綜合測試試題含解析
- 2025年社區(qū)工作的理論與實(shí)務(wù)考試題及答案
- 《設(shè)計(jì)課件:構(gòu)建高效數(shù)據(jù)集教程》
- 2025海南中考:歷史高頻考點(diǎn)
- 國家開放大學(xué)2025年《創(chuàng)業(yè)基礎(chǔ)》形考任務(wù)3答案
- 廚師中級考試試題及答案
- 橋梁除銹施工方案
評論
0/150
提交評論