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

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

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

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

與直接在UIView控件上繪圖不同,在內(nèi)存中繪圖時,需要開發(fā)者自己準(zhǔn)備繪圖環(huán)境,Quartz 2D提供了一個非常便捷的函數(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。


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


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


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


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


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


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


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


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


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


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


器和配套的Storyboard界面設(shè)計文件。本程序無須修改界面設(shè)計文件,也無須自定義UIView控件,該程序只是向該UIView上添加一個UIImageView,并控制該UIImageView顯示內(nèi)存中繪制的圖片即可。因此,該程序只要修改視圖控制器類,該視圖控制器類的實現(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方法所示),也可將圖片輸出到手機本地。


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





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




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




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


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



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


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





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


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


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



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


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



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


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


提示:
讀者可能會想,如果可以直接查看OS X系統(tǒng)的隱藏文件,是不是就可以直接通過Finder進入該模擬器沙盒目錄?實際上,OS X并沒有提供圖形化界面來設(shè)置顯示隱藏文件,不過可以通過命令行進行修改,在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)存中繪圖實例:繪圖板


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


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


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


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


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





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



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


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


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

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

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

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

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


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


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

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

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

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

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


看完上述內(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小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

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

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

廣告

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

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