iOS中如何在內(nèi)存中繪圖-創(chuàng)新互聯(lián)

iOS中如何在內(nèi)存中繪圖,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

劍川網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),劍川網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為劍川上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的劍川做網(wǎng)站的公司定做!

前面介紹的都是通過擴(kuò)展UIView、重寫drawRect:方法進(jìn)行繪圖,這種繪圖方式是直接在UIView控件上繪制所有的圖形——由于每次該控件顯示出來時(shí),drawRect:方法都會(huì)被調(diào)用,這意味著每次該控件顯示出來時(shí),程序都需要重繪所有的圖形,很明顯,這種方式的性能并不好。除此之外,總有些時(shí)候需要在內(nèi)存中繪制圖片,這樣既可導(dǎo)出到手機(jī)本地,也可上傳到網(wǎng)絡(luò)上。

與直接在UIView控件上繪圖不同,在內(nèi)存中繪圖時(shí),需要開發(fā)者自己準(zhǔn)備繪圖環(huán)境,Quartz 2D提供了一個(gè)非常便捷的函數(shù):UIGraphicsBeginImageContext(CGSize size),該函數(shù)用于準(zhǔn)備繪圖環(huán)境。當(dāng)圖形繪制完成后,可調(diào)用UIGraphicsEndImageContext()函數(shù)結(jié)束繪圖和關(guān)閉繪圖環(huán)境。

總結(jié)來說,在內(nèi)存中繪圖的步驟如下。

調(diào)用UIGraphicsBeginImageContext(CGSize size)函數(shù)準(zhǔn)備繪圖環(huán)境。


調(diào)用UIGraphicsGetCurrentContext()函數(shù)獲取繪圖CGContextRef。


用前面介紹的繪制集合圖形、使用路徑等方式進(jìn)行繪圖。


調(diào)用UIGraphicsGetImageFromCurrentImageContext()函數(shù)獲取當(dāng)前繪制的圖形,該方法返回一個(gè)UIImage對象。


調(diào)用UIGraphicsEndImageContext()函數(shù)結(jié)束繪圖,并關(guān)閉繪圖環(huán)境。


除了使用前面介紹需要CGContextRef參數(shù)的方法繪圖之外,還可調(diào)用如下函數(shù)進(jìn)行繪圖。


UIRectFill(CGRect rect):向當(dāng)前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片上填充一個(gè)矩形。


UIRectFillUsingBlendMode(CGRect rect , CGBlendMode blendMode):向當(dāng)前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片上填充一個(gè)矩形,繪制使用指定的混合模式。


UIRectFrame(CGRect rect):向當(dāng)前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片上繪制一個(gè)矩形邊框。


UIRectFrameUsingBlendMode(CGRect rect , CGBlendMode blendMode):向當(dāng)前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片上繪制一個(gè)矩形邊框,繪制使用指定的混合模式。


上面4個(gè)方法都是直接繪制在當(dāng)前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片上,因此,這些方法都不需要傳入CGContextRef作為參數(shù)。


下面的程序示范了在內(nèi)存中繪圖,并將圖片輸出到手機(jī)本地。首先創(chuàng)建一個(gè)Single View Application,該Application包含一個(gè)應(yīng)用程序委托代理類、一個(gè)視圖控制


器和配套的Storyboard界面設(shè)計(jì)文件。本程序無須修改界面設(shè)計(jì)文件,也無須自定義UIView控件,該程序只是向該UIView上添加一個(gè)UIImageView,并控制該UIImageView顯示內(nèi)存中繪制的圖片即可。因此,該程序只要修改視圖控制器類,該視圖控制器類的實(shí)現(xiàn)代碼如下。


程序清單:codes/12/12.2/DrawImage/DrawImage/FKViewController.m

iOS中如何在內(nèi)存中繪圖

iOS中如何在內(nèi)存中繪圖

程序中的第一行粗體字代碼用于創(chuàng)建內(nèi)存中圖片的繪制環(huán)境,接著調(diào)用UIGraphics- GetCurrentContext()方法獲取繪圖的CGContextRef,剩下的繪圖操作與前面介紹的各種繪圖代碼完全相同。


圖形繪制完成后,第二行粗體字代碼調(diào)用UIGraphicsEndImageContext()方法結(jié)束繪圖,繪圖結(jié)束后,即可調(diào)用UIGraphicsGetImageFromCurrentImageContext()函數(shù)獲取當(dāng)前繪制的圖片,程序既可使用UIImageView顯示該圖片(如程序的viewDidLoad方法所示),也可將圖片輸出到手機(jī)本地。


最后一行粗體字代碼調(diào)用了UIImagePNGRepresentation()函數(shù)獲取UIImage圖像的數(shù)據(jù)。該方法返回NSData對象,接下來就可利用NSData的方法執(zhí)行輸出了。





提示:
UIImagePNGRepresentation()函數(shù)的作用是獲取UIImage圖片轉(zhuǎn)換為PNG格式的圖片數(shù)據(jù),還有一個(gè)與之類似的UIImageJPEGRepresentation()函數(shù),其作用是獲取UIImage圖片轉(zhuǎn)換為JPEG格式的圖片數(shù)據(jù),UIImageJPEGRepresentation()函數(shù)多一個(gè)參數(shù),用于指定圖片的壓縮質(zhì)量。




iOS中如何在內(nèi)存中繪圖




編譯、運(yùn)行該程序,即可看到如圖12.13所示的效果。


該程序還將繪制的圖片輸出到該應(yīng)用程序沙盒的Documents文件夾下。對模擬器而言,該Documents文件夾位于OS X系統(tǒng)的一個(gè)隱藏文件夾下。為了查看iOS應(yīng)用程序沙盒的文件夾,請按如下步驟進(jìn)行。



提示:
為了保證系統(tǒng)安全,iOS應(yīng)用程序只能在系統(tǒng)為該應(yīng)用所分配的文件區(qū)域下讀、寫文件,該文件區(qū)域被稱為該應(yīng)用程序的沙盒。iOS應(yīng)用的所有非代碼文件都要保存在此,例如,圖像、圖標(biāo)、聲音、映像、屬性列表、文本文件等。iOS的每個(gè)應(yīng)用程序都有自己獨(dú)立的沙盒,該應(yīng)用程序不能訪問其他應(yīng)用的沙盒。


iOS中如何在內(nèi)存中繪圖





(1)打開Mac OS X系統(tǒng)的Finder。


(2)單擊Finder應(yīng)用中主菜單的“前往”→“前往文件夾”菜單項(xiàng),或單擊command+Shift+G快捷鍵,系統(tǒng)彈出如圖12.14所示的對話框。


(3)在圖12.14所示的對話框中輸入/users/登錄用戶名/library/application suport/iPhone Simulator,然后單擊“前往”按鈕進(jìn)入該文件夾,即可看到5.0、5.1、6.0、6.1、7.0等文件夾,這就是該電腦上已經(jīng)安裝過的iOS模擬器文件夾——不同的文件夾對應(yīng)不同版本的iOS模擬器。



(4)進(jìn)入當(dāng)前iOS模擬器版本對應(yīng)的文件夾,比如當(dāng)前使用iOS 7.0模擬器,則經(jīng)過7.0文件夾進(jìn)入該模擬器,接下來即可看到該模擬器目錄下包括Applications、Media、Root、tmp、資源庫等文件夾,其中,Applications文件夾下保存了該模擬器上安裝的所有iOS應(yīng)用。


(5)進(jìn)入Applications文件夾,即可在該文件夾下看到大量的子文件夾,每個(gè)子文件夾對應(yīng)一個(gè)應(yīng)用程序,找到本應(yīng)用對應(yīng)的子文件夾,并進(jìn)入該子文件夾,即可看到包含Documents、DrawImage.app、Library、tmp內(nèi)容,在Documents文件夾下即可看到剛剛創(chuàng)建的newPng.png圖片,如圖12.15所示。



iOS中如何在內(nèi)存中繪圖


圖12.15  查看模擬器沙盒下的文件


提示:
讀者可能會(huì)想,如果可以直接查看OS X系統(tǒng)的隱藏文件,是不是就可以直接通過Finder進(jìn)入該模擬器沙盒目錄?實(shí)際上,OS X并沒有提供圖形化界面來設(shè)置顯示隱藏文件,不過可以通過命令行進(jìn)行修改,在OS X系統(tǒng)命令行窗口輸入defaults write com.apple.finder AppleShowAllFiles -bool true,然后退出所有的Finder,重啟Finder程序,即可看到隱藏文件;如果希望恢復(fù)隱藏,在命令行窗口輸入defaults write com.apple.finder AppleShowAllFiles -bool false,然后退出所有的Finder,并重啟Finder程序即可


iOS中如何在內(nèi)存中繪圖實(shí)例:繪圖板


該實(shí)例將會(huì)實(shí)現(xiàn)一個(gè)繪圖板,用戶可以根據(jù)喜好隨心所欲地在手機(jī)上“涂鴉”,涂鴉完成后,即可得到自己想要的圖片——這張圖片既可保存到手機(jī)本地,也可通過網(wǎng)絡(luò)分享。


為了實(shí)現(xiàn)這個(gè)應(yīng)用,僅僅通過重寫UIView的drawRect:方法并不適合——如果僅通過重寫UIView的drawRect:方法來實(shí)現(xiàn)繪圖,用戶每次繪圖的時(shí)候就會(huì)丟失上一次繪圖的內(nèi)容。這顯然不是本實(shí)例要實(shí)現(xiàn)的效果。


為了保證用戶每次繪圖的內(nèi)容不會(huì)丟失,將會(huì)在內(nèi)存中創(chuàng)建一張圖片,當(dāng)用戶開始繪圖時(shí),程序會(huì)通過重寫drawRect:方法進(jìn)行實(shí)時(shí)繪制,當(dāng)用戶想要繪制的圖形確定下來后,將該圖形繪制到內(nèi)存中的圖片上。


舉例來說,當(dāng)用戶想要在屏幕上繪制直線時(shí),程序會(huì)把用戶開始觸碰屏幕的第一個(gè)點(diǎn)作為繪圖的起始點(diǎn),當(dāng)用戶手指不離開屏幕而是在屏幕上拖動(dòng)時(shí),程序會(huì)不斷地獲取拖動(dòng)點(diǎn)的坐標(biāo),并調(diào)用該UIView的drawRect:方法,該方法會(huì)從起始點(diǎn)繪制到當(dāng)前拖動(dòng)點(diǎn)——由于drawRect:每次重繪都只繪制起始點(diǎn)到當(dāng)前拖動(dòng)點(diǎn)的直線,因此,用戶可以實(shí)時(shí)看到拖動(dòng)繪制的直線。當(dāng)用戶松開手指時(shí)(表明用戶確定了最終繪制點(diǎn)),在內(nèi)存中的圖片上繪制從起始點(diǎn)到手指松開點(diǎn)的直線即可。


需要指出的是,為了保證用戶能看到之前繪制的圖形,重寫UIView的drawRect:方法時(shí)一定要先把內(nèi)存中的圖片繪制到UIView上。





首先創(chuàng)建一個(gè)Single View Application,該Application包含一個(gè)應(yīng)用程序委托代理類、一個(gè)視圖控制器和配套的Storyboard界面設(shè)計(jì)文件。在Interface Builder中打開界面設(shè)計(jì)文件,將該界面設(shè)計(jì)文件中大的UIView改為使用自定義的FKDrawView類。在界面上方放置一個(gè)UISegmentedControl控件,該控件用于控制繪圖顏色;在界面下方放置一個(gè)工具條,并向工具條中添加一個(gè)UISegmentedControl控件,該控件用于控制繪圖形狀。本應(yīng)用的界面設(shè)計(jì)如圖12.16所示。



iOS中如何在內(nèi)存中繪圖
為了讓界面上的兩個(gè)UISegmentedControl控件能控制用戶繪制的顏色和形狀,需要在Interface Builder中為這兩個(gè)UISegmentedControl控件分別綁定changeColor:和changeShape:兩個(gè)IBAction方法。


為了能記錄該應(yīng)用當(dāng)前需要繪制的圖形,本程序先創(chuàng)建一個(gè)頭文件,該文件中僅定義一個(gè)枚舉類型,代碼如下。


程序清單:codes/12/12.2/HandDraw/HandDraw/Constant.h

iOS中如何在內(nèi)存中繪圖

本應(yīng)用的視圖控制器類比較簡單,主要就是實(shí)現(xiàn)changeColor:和changeShape:兩個(gè)IBAction方法。下面是該視圖控制器類的實(shí)現(xiàn)代碼。
程序清單:codes/12/12.2/HandDraw/HandDraw/FKViewController.m

iOS中如何在內(nèi)存中繪圖

從上面程序中的兩行粗體字代碼可以看出,該視圖控制器類的view并不是UIView,而是自定義的FKDrawView,這個(gè)FKDrawView就是實(shí)現(xiàn)本應(yīng)用的關(guān)鍵,F(xiàn)KDrawView不僅要重寫drawRect:方法,該方法還完成兩件事情:將內(nèi)存中的圖片繪制出來;用戶手指拖動(dòng)進(jìn)行“實(shí)時(shí)”繪制。


FKDrawView類的接口代碼比較簡單,只是定義currentColor、shape兩個(gè)屬性即可,這兩個(gè)屬性用于接收控制器傳入的繪制顏色和繪制形狀。FKDrawView類的實(shí)現(xiàn)代碼如下。


程序清單:codes/12/12.2/HandDraw/HandDraw/FKDrawView.

iOS中如何在內(nèi)存中繪圖iOS中如何在內(nèi)存中繪圖iOS中如何在內(nèi)存中繪圖

iOS中如何在內(nèi)存中繪圖

該程序的關(guān)鍵是上面的粗體字draw:方法,該方法會(huì)根據(jù)想要繪制的圖形類型,繪制不同的形狀。需要讀者留意的是,該方法在兩個(gè)地方被調(diào)用過——當(dāng)用戶拖動(dòng)手指時(shí),激發(fā)touchesMoved: withEvent:方法,該方法中會(huì)通知該控件重繪自己,該控件會(huì)調(diào)用drawRect:方法進(jìn)行重繪,drawRect:方法中調(diào)用了這個(gè)粗體字draw:方法執(zhí)行實(shí)時(shí)繪制。除此之外,當(dāng)用戶手指結(jié)束觸碰時(shí),激發(fā)touchesEnded: withEvent:方法,該方法中調(diào)用了[self draw:buffCtx];代碼,這行代碼將會(huì)把起始點(diǎn)到結(jié)束觸碰點(diǎn)的形狀繪制在內(nèi)存中的圖片上。

程序中還有一個(gè)稍微有點(diǎn)復(fù)雜的地方,就是所謂的“自由繪制”。即當(dāng)用戶手指在屏幕上拖動(dòng)時(shí),程序需要繪制手指拖動(dòng)的軌跡,這條軌跡表面上看是一條不規(guī)則的曲線,但實(shí)際上它由很多很短的線段組成——當(dāng)用戶手指在屏幕上拖動(dòng)時(shí),程序會(huì)不斷地從上一個(gè)觸碰點(diǎn)繪制到當(dāng)前觸碰點(diǎn),由于這些線段都非常短,因此,用戶會(huì)以為我們繪制了一條光滑的曲線。程序?yàn)榱送瓿蛇@個(gè)繪制過程,使用prevPoint保存上一個(gè)觸碰點(diǎn)的坐標(biāo),并不斷地繪制從prevPoint到lastPoint的線段,每次繪制完成后,使用prevPoint保存當(dāng)前觸碰點(diǎn)的坐標(biāo),這對下一次繪制而言,當(dāng)前觸碰點(diǎn)就變成了上一個(gè)觸碰點(diǎn)。


看完上述內(nèi)容,你們掌握iOS中如何在內(nèi)存中繪圖的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

新聞名稱:iOS中如何在內(nèi)存中繪圖-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://bm7419.com/article38/dschpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航網(wǎng)站設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)