iOS9 - UIView
子視圖 & 父視圖
今天主要研究了一下關于UIView章節(jié)的內(nèi)容,發(fā)現(xiàn)以前對UIView的理解太過膚淺舆驶,里面的很多細節(jié)和原理都沒有仔細研究過澎埠。可以說通過今天的研讀真的是受益匪淺熊昌,書中所講的一些內(nèi)容我可能還不知道要什么時候用,但感覺非常有用不明覺厲的感覺湿酸。好了婿屹,接下來我們一起來探索UIView里面的奧秘
很久之前,每個View都擁有一塊屬于自己的矩形區(qū)域推溃,并且超出view涵蓋部分的subview是不可見的昂利。可能這個歷史我們都不曉得因為是很久以前的事了铁坎,現(xiàn)在我門在使用UIView的時候蜂奸,即使子view超出了父view的矩形區(qū)域,子view還是可以顯示,如圖:
view與view之間存在層級關系厢呵,它們之間的層級關系也暗示著view被繪制的順序窝撵。關于view的hierarcy需要自己去意會。
下面是是view層級的一些特性:
- 如果一個view從superview上面移除或者加載到superview上面襟铭,則這個view的subviews也會移除或被加載到superview上
- view的subviews的透明度繼承自view
- 一個view可以選擇性的限制是否繪制超出view本身區(qū)域的subviews,通過view的clipsToBounds屬性
- superview擁有他的subviews短曾,因此在內(nèi)存中寒砖,很像一個數(shù)組管理他的元素。superview持有這些subviews并且負責釋放它們嫉拐,比如當subview不再是父視圖的subview的時候(當subview從superview中移除)哩都,需要注意的是 當你把subview從superview上移除的時候,subview將會被釋放婉徘,如果你在后面還要使用該subview則你需要先retain一遍subview才可以
- 當view的size改變時漠嵌,它的子視圖會自動的重置size
一個UIView包含它的父視圖和子視圖所有的屬性咐汞,因此你可以在代碼中通過
isDescendantOfView:
方法來檢查一個view是否在某個深度是另一個view的子視圖。
如果你需要引用一個特定的view可以通過
viewWithTag:
來查找儒鹿。這需要你事先先給view添加在它的層級范圍內(nèi)唯一的標識
為一個UIView添加subview需要調(diào)用
addSubviews
化撕,在你調(diào)用該方法時,新添加的subview會置于superview的subviews中约炎,并且最后一個被繪制植阴,這也意味著會顯示在屏幕最上層,其實原理就是壓棧圾浅。view會為它的subviews添加索引掠手,索引從0開始。這里還有一些關于添加subview的其他方法
insertSubview:atIndex
insertSubview:belowSubview:, insertSubview:aboveSubview:
exchangeSubviewAtIndex:withSubviewAtIndex:
bringSubviewToFront:, sendSubviewToBack:
view的subviews數(shù)組是對subviews里面列表的一個不可變拷貝狸捕。我對這就話的理解是喷鸽,view中的subviews數(shù)組是一個可變數(shù)組,但是view的subviews屬性是對哪個可變數(shù)組的拷貝灸拍,并且是不可變拷貝做祝。這樣在你將subview從superview中移除的時候,只能一個個的遍歷刪除株搔。不可以一次性的將所有的subviews刪除
myView.subviews.forEach {$0.removeFromSuperview()}
可見度和不透明度
一個View是否可見通過設置它的
hidden
屬性剖淀,為true則隱藏視圖不可見,為false則用戶可見纤房。值得一提的是纵隔,當view的完全透明的時候,則它相當于被hidden掉炮姨,他用戶交互也會被禁用
alpha: 通過alpha屬性可以設置視圖部分或完全透明捌刮。1.0代表不透明,0.0代表透明舒岸。當你給父視圖設置
alpha = 0.5
則它的子視圖的不透明度絕不會超過0.5绅作。比如說你給一個view的alpha設置為1.0但是它的背景卻是透明的,那是因為view的backgroundcolor的alpha值一定小于1.0
opaque:UIView中存在一個opaque(不透明)屬性蛾派,它是一個布爾類型俄认。我對于這個屬性的理解還不透徹,總結起來好像是說如果view的alpha值 < 1 ,opaque應該設置為NO洪乍,如果alpha = 1眯杏,opaque應該為YES,opaque的默認值是YES壳澳。其用途主要是提升繪制的性能岂贩。
今天就看了這么多內(nèi)容,精彩內(nèi)容明天繼續(xù)巷波,fightingN颉P渡 !
若有紕漏歡迎指正锉屈,共同進步??