UIView的屬性

在iOS開發(fā)中UIView有一些不常用的屬性及方法。下面做一些簡(jiǎn)單介紹:

1、autoresizingMask

setAutoresizingMask控件的自適應(yīng)

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {

UIViewAutoresizingNone? ? ? ? ? ? ? ? = 0,

UIViewAutoresizingFlexibleLeftMargin? = 1 << 0,

UIViewAutoresizingFlexibleWidth? ? ? ? = 1 << 1,

UIViewAutoresizingFlexibleRightMargin? = 1 << 2,

UIViewAutoresizingFlexibleTopMargin? ? = 1 << 3,

UIViewAutoresizingFlexibleHeight? ? ? = 1 << 4,

UIViewAutoresizingFlexibleBottomMargin = 1 << 5

};

1、UIViewAutoresizingNone? 這個(gè)屬性是指,控件相對(duì)于父視圖坐標(biāo)沒有任何改變(不管父視圖的長(zhǎng)寬改變?yōu)槎嗌伲涌丶淖鴺?biāo)是定值)

2、UiViewAutoresizingFlexibleleftMargin ? ? ? ? 控件相對(duì)于父視圖,隨著父視圖的寬度比例變化,橫坐標(biāo)跟著變化,比如說上面的lable frame = CGRectmake(50,100,200,40); ? 如果之前父視圖的長(zhǎng)寬是320*480 ?現(xiàn)在變成了480*320 ?那么在父視圖改變之后,如果只限制這一個(gè)屬性,那么變化后的lable橫坐標(biāo)就變?yōu)椋?50*(480/320) lable的坐標(biāo)就是:(50*(480/320),100,200,40);

3、UIViewAutoresizingFlexibleRightmargin 、?UIViewAutoresizingFlexibleTopmargin 、?UIViewAutoresizingFlexibleBottommargin ?三個(gè)屬性和2)類似;

4、UIViewAutoResizingFlexibleWidth ?和2類似,只不過是lable的寬度按照比例發(fā)生改變


2、UIView 的transform屬性

UIView的transform屬性,通過設(shè)置該屬性,我們可以實(shí)現(xiàn)調(diào)整該view在其superView中的大小和位置,具體來說,Transform(變化矩陣)是一種3×3的矩陣,通過這個(gè)矩陣我們可以對(duì)一個(gè)坐標(biāo)系統(tǒng)進(jìn)行縮放,平移,旋轉(zhuǎn)以及這兩者的任意組著操作。而且矩陣的操作不具備交換律,即矩陣的操作的順序不同會(huì)導(dǎo)致不同的結(jié)果。

獲得CGAffineTransform有多種方法,例如使用CGAffineTransformMake,但是對(duì)于矩陣操作相對(duì)比較麻煩,但是事實(shí)上iOS已經(jīng)為我們提供好了三個(gè)對(duì)應(yīng)的方法,分別用于在原來的角度、縮放、移動(dòng)位置的基礎(chǔ)上做出修改:CGAffineTransformRotate、CGAffineTransformScale、CGAffineTransformTranslate

view.transform=CGAffineTransformScale(view.transform, 0.5, 0.5);//? 實(shí)現(xiàn)的是放大和縮小

view.transform=CGAffineTransformRotate(view.transform, M_PI); //實(shí)現(xiàn)的是旋轉(zhuǎn)

view.transform=CGAffineTransformTranslate(view.transform,20, 20);//實(shí)現(xiàn)的是平移

創(chuàng)建一個(gè)CGAffineTransform transform對(duì)象

CGAffineTransform transform;

transform = CGAffineTransformRotate(manImageView.transform,M_PI/6.0);//設(shè)置旋轉(zhuǎn)度數(shù)

[UIView beginAnimations:@"rotate" context:nil ];//動(dòng)畫開始

[UIView setAnimationDuration:2];//動(dòng)畫時(shí)常

[UIView setAnimationDelegate:self];//添加代理

[manImageView setTransform:transform];//獲取transform的值

[UIView commitAnimations];//關(guān)閉動(dòng)畫


3、UIView的contentMode屬性

這個(gè)屬性的值決定了,當(dāng)視圖的幾何形狀變化時(shí)如何復(fù)用它的內(nèi)容。當(dāng)視圖第一次展示前,它會(huì)將自己的內(nèi)容渲染成一張底層的bitmap. 然后視圖的幾何變化都不會(huì)使bitmap重新生成。而視圖contentMode屬性的值決定了bitmap是否縮放、位置在哪兒(固定在左邊、右邊、上面、下面、居中)。默認(rèn)情況下,contentMode的值是UIViewContentModeScaleToFill。

UIViewContentModeScaleToFill ? ? ? //改變內(nèi)容的高寬比例,縮放內(nèi)容,UIView中完整顯示內(nèi)容,填滿UIView

UIViewContentModeScaleAspectFit ? ? //保持內(nèi)容的高寬比,縮放內(nèi)容,完整顯示內(nèi)容,最大化填充UIview,沒填充上的區(qū)域透明

UIViewContentModeScaleAspectFill ? ? ?//保持內(nèi)容高寬比,縮放內(nèi)容,超出視圖的部分內(nèi)容會(huì)被裁減,填充UIView

UIViewContentModeRedraw ? ? //當(dāng)View的bounds改變,系統(tǒng)會(huì)調(diào)用setNeedsDisplay,重新繪制視圖

UIViewContentModeCenter ? ? ? ? ? ? ? ?//不縮放,內(nèi)容在視圖中間

UIViewContentModeTop ? ? ? ? ? ? ? ? ?//內(nèi)容在視圖頂部

UIViewContentModeBottom ? ? ? ? ? //內(nèi)容在視圖底部

UIViewContentModeLeft ? ? ? ? ? ? ? ?//內(nèi)容在視圖左邊

UIViewContentModeRight ? ? ? ? ? //內(nèi)容在視圖右邊?

UIViewContentModeTopLeft ? ? ? ? ? //?the top-left corner of the view.

UIViewContentModeTopRight ? ? ? ? ? ?//?the top-right corner of the view.

UIViewContentModeBottomLeft ? ? ? //the bottom-left corner of the view.

UIViewContentModeBottomRight ? ? ? ? ? //?the bottom-right corner of the view.


4、layoutSubviews方法

這個(gè)方法,默認(rèn)沒有做任何事情,需要子類進(jìn)行重寫 。 系統(tǒng)在很多時(shí)候會(huì)去調(diào)用這個(gè)方法:

1、初始化不會(huì)觸發(fā)layoutSubviews,但是如果設(shè)置了不為CGRectZero的frame的時(shí)候就會(huì)觸發(fā)。

2、addSubview會(huì)觸發(fā)layoutSubviews

3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化

4、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews

5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件

6、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件

在蘋果的官方文檔中強(qiáng)調(diào): You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 當(dāng)我們?cè)谀硞€(gè)類的內(nèi)部調(diào)整子視圖位置時(shí),需要調(diào)用。反過來的意思就是說:如果你想要在外部設(shè)置subviews的位置,就不要重寫。


5、setNeedsLayout方法

標(biāo)記為需要重新布局,不立即刷新,但layoutSubviews一定會(huì)被調(diào)用

配合layoutIfNeeded立即更新


6、layoutIfNeeded方法

如果,有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局


7、drawRect方法

這個(gè)方法是用來重繪的。

drawRect在以下情況下會(huì)被調(diào)用:

1、如果在UIView初始化時(shí)沒有設(shè)置rect大小,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用。drawRect調(diào)用是在Controller->loadView, Controller->viewDidLoad 兩方法之后掉用的.所以不用擔(dān)心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時(shí)候需要用到某些變量值).

2、該方法在調(diào)用sizeToFit后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法。

3、通過設(shè)置contentMode屬性值為UIViewContentModeRedraw。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:。

4、直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個(gè)前提條件是rect不能為0。以上1,2推薦;而3,4不提倡

drawRect方法使用注意點(diǎn):

1、若使用UIView繪圖,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個(gè)invalidate的ref并且不能用于畫圖。drawRect:方法不能手動(dòng)顯示調(diào)用,必須通過調(diào)用setNeedsDisplay 或者 setNeedsDisplayInRect,讓系統(tǒng)自動(dòng)調(diào)該方法。

2、若使用calayer繪圖,只能在drawInContext: 中(類似于drawRect)繪制,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法3、若要實(shí)時(shí)畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實(shí)時(shí)刷新屏幕


8、sizeToFit方法

sizeToFit會(huì)自動(dòng)調(diào)用sizeThatFits方法;

sizeToFit不應(yīng)該在子類中被重寫,應(yīng)該重寫sizeThatFits

sizeThatFits傳入的參數(shù)是receiver當(dāng)前的size,返回一個(gè)適合的size

sizeToFit可以被手動(dòng)直接調(diào)用sizeToFit和sizeThatFits方法都沒有遞歸,對(duì)subviews也不負(fù)責(zé),只負(fù)責(zé)自己

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容