iOS 繪畫學習(5)

2022-03-01 10:07:19 字數 2906 閱讀 1629

為了給繪製新增陰影,可以在繪製之前,給上下文乙個陰影值。陰影的位置用cgsize表示,cgsize裡的兩個正數表示向下和向右方向。這個模糊值是乙個可以無窮大的正數。蘋果沒有解析這個拉伸是如何工作的,不過經驗顯示,12是乙個剛好的值,99就會顯得太銳利。下面是我們在繪製之前,新增的**:

con = uigraphicsgetcurrentcontext();

cgcontextsetshadow(con, cgsizemake(7, 7), 12);

[self.arrow drawatpoint:cgpointmake(0,0)]; // ... and so on

但是這樣效果好像不是很明顯,而且我們每次繪製箭頭都會讓陰影重疊。我們希望有乙個陰影作用於所有的箭頭,為了達到這個目的,我們可以使用乙個透明圖層,基本上算是乙個子上下文:

cgcontextref con = uigraphicsgetcurrentcontext();

cgcontextsetshadow(con, cgsizemake(7, 7), 12);

cgcontextbegintransparencylayer(con, nil);

[self.arrow drawatpoint:cgpointmake(0,0)];

for (int i=0; i<3; i++)

cgcontextendtransparencylayer(con);

函式cgcontextclearrect 會清除矩形區域裡所有已存在的繪製。結合剪下,它能清除任何形狀的區域。

cgcontextclearrect 的行為根據上下文是否是透明而有所不同。在繪製影象時,如何影象上下文是透明的--uigraphicsbeginimagecontextwithoptions 第二個引數是no --cgcontextclearrect 會清除為透明的,否則就會清除為黑色。

當在乙個檢視view中直接繪製時(例如drawrect: 或者 drawlayer:incontext:),如果檢視的背景顏色是nil或者是一種含有哪怕一點透明的顏色,cgcontextclearrect的結果都是透明的。如果背景顏色是完全不透明的,那麼cgcontextclearrect的結果將是黑色。這是因為檢視背景顏色決定了這個檢視上下文是透明的,還是不透明的。

上圖的繪製是完全一樣的,除了背景顏色乙個是完全不透明藍色,乙個是不透明度是0.99的藍色。我們用cgcontextclearrect 清除掉左上角的正方形。 這個檢視的drawrect:看上去像下面那樣:

cgcontextref con = uigraphicsgetcurrentcontext();

cgcontextsetfillcolorwithcolor(con, [uicolor bluecolor].cgcolor);

cgcontextfillrect(con, rect);

cgcontextclearrect(con, cgrectmake(0,0,30,30));

點是描述乙個在x軸和y軸方向上無維的位置。當我們在圖形上下文中繪製時,指定了在**繪製,這個位置是與裝置解析度無關的。因為core graphics使用ctm和抗鋸齒來對應你的繪製在實際的裝置輸出上。

但是畫素是存在的。乙個畫素是真實世界中乙個實際的,數位化的顯示單元。。我們有時候會看到有人建議把線的位置放在0.5的位置上,來把這條線的畫素居中,這個建議可能會有用,但是把情況簡單化了。uiview有乙個contentscalefactor引數,這個值不是1.0,就是2.0。你可以通過這個引數把畫素轉換成點。考慮到我們大多數情況是填充乙個矩形,而不是描邊乙個路徑。所以下面的**可以在任意裝置上都繪製一條完美的1畫素寬的垂直線。

cgcontextfillrect(con, cgrectmake(100,0,1.0/self.contentscalefactor,100));
乙個檢視會在它本身還繪製一些其他的東西,和僅僅有背景顏色和子檢視不同,它是有內容的。這意味著當重新調整大小時它的 contentmode 屬性變得非常重要。正如我前面說到的,繪畫系統總是避免要求乙個檢視重新繪製自己,而是使用之前繪畫操作快取的結果(影象後備儲存)。所以,如果乙個檢視被重新調整大小,系統可能只是簡單的根據你的contentmode屬性來拉伸,收縮或者重新定位快取中的繪畫。

下面我沿用之前的**繪製箭頭,子類化乙個view,然後在drawrect:中繪製箭頭,只是在延時一段時間後把這個view 的高度變成原來的兩倍,得到下面的結果:

但是很快,drawrect:這個方法還是會呼叫,這樣我們的繪製就會被重新重新整理。由於我們的**中並沒有指定箭頭的高度與檢視的bounds 的高度有關,所以箭頭會變成原來的大小,而不是被拉伸的箭頭。

由於我們的drawrect:方法中指定的箭頭的大小和位置與檢視的bounds的原點有關,就是左上角,因此我們可以設定檢視的contentmode屬性為uiviewcontentmodetopleft.還有,我們可以設定contentmode屬性為uiviewcontentmoderedraw,這樣自動拉伸和收縮就是關閉,當檢視被重新調整大小,它的setneedsdisplay 方法會被呼叫,接著觸發drawrect:來重新繪製內容。

pyQt5 學習筆記(2)基本視窗繪畫

二 練習 import sys if name main sys.ar 是執行python指令碼的時候 可以往程式輸入引數 w qwidget 建立視窗物件 w.resize 250,150 視窗大小 w.move 300,300 視窗位置 即執行程式後,視窗的座標 w.setwindowtitle...

canvas學習繪畫矩形

1.掌握繪製矩形的方法 strkerect fillrect 2.掌握繪製路徑的beginpath 和closepath beginpath 用來建立新的路徑 closepath 從當前點回到起始點,封閉路徑 邊角無漏 context3.moveto 100,100 context3.lineto ...

iOS學習筆記 (5)NSDate和NSTimer

nsdate類的使用 1 建立日期物件 nsdate date1 nsdate alloc init nslog date1 預設格林尼治時間相差 8個時區 2 nsdate date2 nsdate date 返回乙個從1970 01 01 00 00 00 後一段時間的時間 date2 nsda...