uiview

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開始,蘋果經過兩個協議(UIAppearanceUIAppearanceContainer)規範了對許多UIKit控件定製的支持。全部遵循UIAppearance協議的UI控件經過定製均可以呈現各類外觀。

 */

@property(nonatomic,copy) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;

 

/**

 * 透明度,值是01.0之間,默認是1.0不透明。

 * 當把alpha的值設置成0之後:

 * 1、當前的viewsubview都會被隱藏,而無論subviewalpha值爲多少。

 * 2、當前view會從響應者鏈中移除,而響應者鏈中的下一個會成爲第一響應者。

 * 默認是有動畫效果的。

 */

@property(nonatomic) CGFloat alpha;

 

/**

 * 不透明度,默認是YES不透明。

 * 這個屬性你們應該會很陌生,opaque屬性是給繪圖系統提供一個性能優化開關。

 * 若是該值爲YES,那麼繪圖在繪製該視圖的時候把整個視圖看成不透明對待。這樣,繪圖系統在執行繪圖過程當中會優化一些操做並提高系統性能;若是是設置爲NO,繪圖系統將其和其餘內容平等對待,不去作優化操做。爲了性能方面的考量,默認設置爲YES

 * 若是opaque被設置成YES,而對應viewalpha屬性不爲1.0的時候,就會有不可預料的狀況發生,這一點蘋果在官方文檔中有明確的說明。

 * 所以,若是視圖部分或所有支持透明,那麼你必須把opaque這個值設置爲NO。這點應該不少人都不知道,切記切記。

 * 能夠打開模擬器Debug下的Color Blended Layers,其中綠色表明不透明部分,紅色表明透明部分。紅色部分越多,對性能影響也越大,由於GPU須要對這些透明部分進行特殊處理。

 * 解決blended layer問題也很簡單,檢查紅色區域viewopaque屬性,記得設置成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、當前的viewsubview都會被隱藏,而無論subviewhidden值爲多少。

 * 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.01.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是用來在視覺上說明屏幕上哪些控件是活躍的或者有相關的活動。例如barButtonItemstabBarItems默認使用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

相關文章
相關標籤/搜索