UIView是全部控件的父類,UIView的API則相對比較底層了,繪圖,自動佈局,動畫。
性能優化
這章有點費勁,有些屬性和方法本身之前用過,還有些是查資料加本身試的,尤爲opaque這個屬性,花了兩個小時才弄明白。還有幾個屬性還不是很明白,等熟悉了以後再補充詳細說明上去吧。佈局
@interface UIView(UIViewRendering)性能
/**優化
* 繪圖,好比圖文混排,畫個三角行。動畫
* 須要在子視圖中重寫,和coreText結合使用的。atom
* 當時作的表情文字混排重寫了這個方法,雖然作過一遍可是仍只會個皮毛。spa
*/.net
- (void)drawRect:(CGRect)rect;3d
/**繼承
* 顯示view調用setNeedsDisplay或者setNeedsDisplayInRect:方法。
* setNeedsDisplay是更新整個view。
* setNeedsDisplayInRect是更新view的部分區域。
*/
- (void)setNeedsDisplay;
- (void)setNeedsDisplayInRect:(CGRect)rect;
/**
* 修剪邊界,默認是NO。
* 若是子視圖的範圍超出了父視圖的邊界,那麼超出的部分就會被裁剪掉。這個屬性在《UILabel跑馬燈》提到。
*/
@property(nonatomic) BOOL clipsToBounds;
/**
* 背景顏色,默認是nil。
* 後面有個UI_APPEARANCE_SELECTOR,從iOS 5開始,蘋果經過兩個協議(UIAppearance和UIAppearanceContainer)規範了對許多UIKit控件定製的支持。全部遵循UIAppearance協議的UI控件經過定製均可以呈現各類外觀。
*/
@property(nonatomic,copy) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;
/**
* 透明度,值是0和1.0之間,默認是1.0不透明。
* 當把alpha的值設置成0之後:
* 1、當前的view和subview都會被隱藏,而無論subview的alpha值爲多少。
* 2、當前view會從響應者鏈中移除,而響應者鏈中的下一個會成爲第一響應者。
* 默認是有動畫效果的。
*/
@property(nonatomic) CGFloat alpha;
/**
* 不透明度,默認是YES不透明。
* 這個屬性你們應該會很陌生,opaque屬性是給繪圖系統提供一個性能優化開關。
* 若是該值爲YES,那麼繪圖在繪製該視圖的時候把整個視圖看成不透明對待。這樣,繪圖系統在執行繪圖過程當中會優化一些操做並提高系統性能;若是是設置爲NO,繪圖系統將其和其餘內容平等對待,不去作優化操做。爲了性能方面的考量,默認設置爲YES。
* 若是opaque被設置成YES,而對應view的alpha屬性不爲1.0的時候,就會有不可預料的狀況發生,這一點蘋果在官方文檔中有明確的說明。
* 所以,若是視圖部分或所有支持透明,那麼你必須把opaque這個值設置爲NO。這點應該不少人都不知道,切記切記。
* 能夠打開模擬器Debug下的Color Blended Layers,其中綠色表明不透明部分,紅色表明透明部分。紅色部分越多,對性能影響也越大,由於GPU須要對這些透明部分進行特殊處理。
* 解決blended layer問題也很簡單,檢查紅色區域view的opaque屬性,記得設置成YES;檢查backgroundColor屬性是否是[UIColor clearColor]。
*/
@property(nonatomic,getter=isOpaque) BOOL opaque;
/**
* 決定繪製前是否清屏,默認爲YES。用於提升描畫性能,特別是在可滾動的視圖中。
* 當這個屬性被設置爲YES時,UIKIt會在調用drawRect:方法以前,把即將被該方法更新的區域填充爲透明的黑色。
* 將這個屬性設置爲NO能夠取消相應的填充操做,view中原有內容會保留。
*/
@property(nonatomic) BOOL clearsContextBeforeDrawing;
/**
* 是否隱藏,NO是顯示,YES是隱藏,默認是NO。
* 當值設爲YES時:
* 1、當前的view和subview都會被隱藏,而無論subview的hidden值爲多少。
* 2、當前view會從響應者鏈中移除,而響應者鏈中的下一個會成爲第一響應者。
*/
@property(nonatomic,getter=isHidden) BOOL hidden;
/**
* 視圖內容的填充方式。類型是UIViewContentMode。默認值是UIViewContentModeScaleToFill,填充到整個視圖區域,不等比例拉伸。
*/
@property(nonatomic) UIViewContentMode contentMode;
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill, //填充到整個視圖區域,不等比例拉伸
UIViewContentModeScaleAspectFit, //長寬等比填充視圖區域,當某一個邊到達視圖邊界的時候就再也不拉伸,保證內容的長寬比是不變的同時儘量的填充視圖區域。
UIViewContentModeScaleAspectFill, //長寬等比填充視圖區域,當某一個邊到達視圖邊界的時候還繼續拉伸,直到另外一個方向達到視圖邊界。內容的長寬比不變的同時填滿整個視圖區域,不顯示超過的部分。
UIViewContentModeRedraw, //重繪視圖邊界
UIViewContentModeCenter, //視圖居中
UIViewContentModeTop, //視圖頂部對齊
UIViewContentModeBottom, //視圖底部對齊
UIViewContentModeLeft, //視圖左側對齊
UIViewContentModeRight, //視圖右側對齊
UIViewContentModeTopLeft, //視圖左上角對齊
UIViewContentModeTopRight, //視圖右上角對齊
UIViewContentModeBottomLeft, //視圖左下角對齊
UIViewContentModeBottomRight, //視圖右下角對齊
};
/**
* 注意以上幾個常量,凡是沒有帶Scale的,當圖片尺寸超過ImageView尺寸時,只有部分顯示在ImageView中。UIViewContentModeScaleToFill屬性會致使圖片變形。UIViewContentModeScaleAspectFit會保證圖片比例不變,並且所有顯示在ImageView中,這意味着ImageView會有部分空白。UIViewContentModeScaleAspectFill也會證圖片比例不變,可是是填充整個ImageView的,可能只有部分圖片顯示出來。
*/
/**
* 視圖拉伸區域,默認是{{0,0} {1,1}}。如今棄用:請用-(UIImage resizableImageWithCapInsets:]來實現一樣的效果。
* 你能夠用contentStretch屬性來定義一個視圖的可拉伸區域。這個屬性的值一個邊的值被標準化爲0.0到1.0之間的矩形。當拉伸這個視圖時,系統將視圖的當前邊界值和放縮因子乘以標準值,以便決定哪些像素須要被拉伸。使用標準值能夠減輕每次改變視圖的邊界值都更新contentStretch屬性的須要。
*/
@property(nonatomic) CGRect contentStretch NS_DEPRECATED_IOS(3_0,6_0);
/**
* 這個是和自動佈局相關的,具體使用等我弄明白以後補充上來。
*/
@property(nonatomic,retain) UIView *maskView NS_AVAILABLE_IOS(8_0);
/**
* 色調顏色,開始用於iOS7。
* tintColor是用來在視覺上說明屏幕上哪些控件是活躍的或者有相關的活動。例如barButtonItems和tabBarItems默認使用tintColor。
* 若是一個view沒有顯示地指定tintColor,它將繼承父視圖的tintColor,所以在整個視圖層次結構中將有一個連鎖反應。
* 最簡單的狀況是你能夠經過一行代碼來給整個APP指定一個顏色主題:
[[UIApplication sharedApplication] keyWindow].tintColor = [UIColor orangeColor];
* 由於UIWindow繼承自UIView,因此咱們能夠指定一個tintColor,而後應用內的全部子視圖將繼承這個顏色。
* UINavigationBar設置tintColor爲白色,則按鈕的顏色就是白色,可是背景色不是白色。
*/
@property(nonatomic,retain) UIColor *tintColor NS_AVAILABLE_IOS(7_0);
/**
* 色調模型,能夠和tintColor結合着使用。
*/
@property(nonatomic) UIViewTintAdjustmentMode tintAdjustmentMode NS_AVAILABLE_IOS(7_0);
/**
* 更新視圖的渲染。
*/
- (void)tintColorDidChange NS_AVAILABLE_IOS(7_0);
@end