Quartz2D的簡單使用概述(三)

        這裏交代一些作圖時可能遇到的問題:

問題一:當同時畫多條線時,在第一條線設置屬性後,後面畫的所有線都會延用這些屬性來繪製。

        其實解決的方法很簡答,就是在繪製一條新的線條時重置下繪製的屬性即可,比如,在畫第一條是的屬性設置是:

        CGContextSetLineWidth(ctx,12);    //線條寬度

        [[UIColor redColor]set];                   //線條顏色

        CGContextSetLineCap(ctx,kCGLineCapRound);    //端點樣式

        在繪製第二條線時不想要延用這個屬性繼續繪製,那麼可以重置這些屬性:

        CGContextSetLineWidth(ctx,1);    

        [[UIColor blackColor]set];                   

        CGContextSetLineCap(ctx,kCGLineCapButt);   

        但是這樣就出現了新的問題,如果繪製的線條過多,每次到新的線條都要重置屬性,這樣操作起來就會非常麻煩。當然了,蘋果不可能沒想到這樣的問題,自然也有相應的解決方法了。不過在這之前我們要了解一個新的概念-----圖形上下文棧:用於保存圖形上下文的狀態。
        大體過程是:在設置完第一條線的繪製屬性前,我們先保存一份最純潔的圖形上下文(此時是沒有做過任何操作的圖形上下文),然後設置完第一條線,到第二條線之前,我們拿出之前保存的圖形上下文繪製,這樣第二條線繪製的屬性其實就是系統默認的屬性了。

        獲取完圖形上下文後,調用函數CGContextSaveGState(ctx);

在需要重置屬性的線條前面調用函數CGContextRestoreGState(ctx);即可

非常簡單的兩部,但是要說明的是,每次保存都是一份,調用一次之後就沒有了,如果要重置幾次就保存幾次,然後調用,如果調用次數大於保存次數會直接掛掉喲~


問題二:繪製矩形時如何讓矩形旋轉角度?

        這樣的情況我們在開發中可能會遇到,這個問題的解決就是使用系統自帶的函數即可。

        1、.....獲取上下文,然後

        2、CGContextRotateCTM(ctx,M_Pi_4);

        3、....設置繪製屬性

        4、....渲染

        以上方法用於旋轉角度的屬性設置,要注意的是:這裏的旋轉不是將繪製的圖形旋轉,而是將整個layer旋轉,而所有的繪製都是在layer上進行的,所以這個函數要在繪製屬性設置之前就調用,不然無效。

        除了旋轉以外,還有縮放和平移。

        CGContextScaleCTM(ctx,x,y);    //縮放(x代表寬的倍數,y代表高的倍數)

        CGContextTranslateCTM(ctx,x,y);    //平移(x、y分別代表x、y上的偏移量)


問題三:如何讓繪製的圖片顯示成圓形?

        解決這個問題的思路:先畫一個圓形,把圖片繪製在這個圓裏面,超出這個圓形範圍的部分不顯示。具體的代碼:

        1、獲取上下文...

        2、CGContextAddEllipseInRect(ctx,CGRectMake(100,100,50,50));    //畫一個圓心在(100,100),半徑爲50的圓形

        //關鍵的一步

        3、CGContextClip(ctx);    //指定上下文中可以顯示內容的就是上面畫的圖形的範圍

        4、把圖片繪製到(100,100)的點即可。

        當然了,正式項目中根據不同的需求,可以讓圖片顯示在矩形、三角形或者其他各種形狀裏。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章