1.視圖
視圖是UIView對象,或是UIView子類對象,視圖知道如何繪制自己,視圖可以處理事件(touch),視圖會按層次結構排列,位于視圖層次結構頂端的是應用窗口。
層次結構中的每個視圖(包括UIWindow對象)分別繪制自己。視圖會將自己繪制到圖層(layer)上,每個UIView對象都有一個layer屬性,指向一個CALayer類的對象,可以將圖層看成是一個位圖圖像(bitmap image)。
視圖Frame參數值的單位是點(points),不是像素。這是為了讓視圖能夠在Retina與非Retina顯示器上大小保持一致。同時為了保持應用界面在不同分辨率的屏幕上看起來一致,大小、位置、直線、曲線等都使用點作為單位。
frame和bounds表示的矩形用法不同。frame用于確定與視圖層次結構中其他視圖的相對位置,從而將自己的圖層與其他視圖的圖層正確組合成屏幕上的圖像。而bounds屬性用于確定繪制區域,避免將自己繪制到圖層邊界之外。
“MIN ( value1, value2 )”:取最小值
將圖片繪制到視圖:
UIImage *logoImage = [UIImage imageNamed:@"logo.png"];
[logoImage drawInRect:someRect];
視圖的drawRect:方法在執行之前,系統首先為視圖的圖層創建一個圖形上下文,然后為繪圖狀態設置一些默認參數。drawRect:方法開始執行時,隨著圖形上下文不斷執行繪圖操作,圖層上的內容也會隨之改變。drawRect:執行完畢后,系統會將圖層與其他圖層一起組合成完整的圖像并顯示在屏幕上。
圖形上下文陰影:CGContextSetShadow
圖形顏色漸變:CGGradientRef
2.運行循環和重繪視圖
運行循環的工作是監聽事件,當事件發生時,運行循環會為相應的事件找到合適的處理方法。這些處理方法會調用其他方法,而這些方法又會調用更多其他方法,以此類推。只有當這些方法都執行完畢時,控制權才會再次回到運行循環。如果循環收到setNeedDisplay消息的視圖,那將會向該視圖發送drawRect消息,執行重繪。
iOS做了兩方面優化來保證用戶界面的流暢性---不重繪顯示的內容沒有改變的視圖;在每次事件處理周期(event handling cycle)中只發送一次drawRect:消息。在事件處理周期中,視圖的屬性可能會發生多次的改變,如果視圖在每次改變時都重繪自己,就會減慢界面的響應速度。相反,iOS會在運行循環的最后階段集中處理所有需要重繪的視圖,尤其是對于屬性發生多次改變的視圖,在每次事件處理周期中只重繪一次。