Window是UIWindow class下的實(shí)例并且處理了總體的application的UI的展現(xiàn)渴肉。大部分來(lái)說(shuō)旧乞,app的window不會(huì)有變化树姨。
View是在CALayers之間的連接處工作问窃,去渲染和變換view的內(nèi)容。所有UIKit的view背后都有一個(gè)layer對(duì)象(通常是CALayer 的class)卤妒,這些layer對(duì)象是存儲(chǔ)views和處理view相關(guān)的動(dòng)畫(huà)。
CALayer對(duì)象的作用對(duì)性能有很大的提升字币。實(shí)際view對(duì)象的drawing代碼調(diào)用越少越好则披,并且當(dāng)代碼被調(diào)用,結(jié)果會(huì)被Core Animation緩存并且會(huì)被盡可能多的復(fù)用洗出。復(fù)用尤其在animation的時(shí)候非常有用士复。 因此越多復(fù)用越少系統(tǒng)消耗。
UIView類(lèi)使用了按需drawing模型來(lái)展示內(nèi)容翩活。
當(dāng)你的view的內(nèi)容變化時(shí)阱洪,不應(yīng)當(dāng)直接redraw這些內(nèi)容。相反菠镇,應(yīng)當(dāng)通過(guò)setNeedsDisplay或者setNeedsDisplayInRect:method方法來(lái)使這些view失效冗荸。這些方法告訴系統(tǒng)view有變化并且需要在下一個(gè)節(jié)點(diǎn)上來(lái)重繪。系統(tǒng)會(huì)等到當(dāng)前runloop的結(jié)束在重新進(jìn)行任何重繪之前利耍,這個(gè)delay會(huì)給機(jī)會(huì)去刪除view或者隱藏view蚌本,或者其他形式的對(duì)view的操作盔粹。所有操作都會(huì)在同一時(shí)間得到反應(yīng)。
修改view的集合特性(比如修改位置)并不會(huì)自動(dòng)的使得view的內(nèi)容重繪程癌。
當(dāng)渲染view的內(nèi)容時(shí)舷嗡,實(shí)際drawing過(guò)程會(huì)因view和它對(duì)應(yīng)配置而有所不同。系統(tǒng)的view通常會(huì)繼承private的drawing方法來(lái)渲染content嵌莉。這些系統(tǒng)views會(huì)暴露出接口來(lái)供你修改view的實(shí)際顯現(xiàn)进萄。 如果要自定義UIView的subclass,經(jīng)常要重寫(xiě)drawRect方法并繪制自己的內(nèi)容烦秩。通常提供view的內(nèi)容的方法有很多垮斯,比如直接設(shè)置view的下層layer,或者重載drawRect方法是最通常的技術(shù)只祠。
當(dāng)View開(kāi)始被顯示時(shí)兜蠕,結(jié)果被capture在下層的bitmap中。之后抛寝,view幾何屬性的變化并不會(huì)經(jīng)常導(dǎo)致bitmap被重新創(chuàng)建熊杨。取而代之的是,contentMode的值會(huì)決定bitmap是否應(yīng)當(dāng)去裁剪以適應(yīng)新的bounds或者定位在某個(gè)view的邊緣之上盗舰。
ContentMode是循環(huán)利用view的contents的好方法晶府,但是你依然能設(shè)置conent Mode為UIViewContentModeRedraw,尤其當(dāng)你想在scaling或者resizing操作時(shí)去自定義views或者去redraw時(shí)钻趋。此值下川陆,系統(tǒng)會(huì)強(qiáng)制調(diào)用drawRect:方法來(lái)響應(yīng)幾何變換。
- 如果一個(gè)view的集合特性改變了蛮位,UIKit會(huì)update它的subviews通過(guò)如下規(guī)則:
a) 如果配置了autoresizing rules较沪,UIKit僅僅adjust每一個(gè)view通過(guò)這些rules。
b) 如果實(shí)現(xiàn)了layoutSubviews方法失仁,UIKit會(huì)調(diào)用它尸曼。可以通過(guò)這個(gè)方法來(lái)調(diào)整任何subviews的位置和size萄焦。 - 如果任何view被標(biāo)記為需要被redrawn控轿,UIKit會(huì)讓view去自己redraw。對(duì)于定義了drawRect方法的自定義view拂封,UIKit會(huì)調(diào)用那個(gè)方法茬射。
- frame,boundsproperties的關(guān)系
a) frame是指在其父 中的坐標(biāo)系統(tǒng)中的frame矩形屬性;
b) bounds是指在view自己的坐標(biāo)系統(tǒng)中的bounds矩形屬性 - 使用center或者frame屬性主要為了管理當(dāng)前view的幾何屬性烘苹,比如修改位置或者尺寸躲株。
- 針對(duì)只修改位置的情況,center屬性是最佳方案
- 在drawing過(guò)程中主要使用bounds屬性
- 雖然可以單獨(dú)修改frame镣衡、bounds霜定、center屬性档悠,但是其中這些屬性會(huì)互相影響:
a) Set frame屬性時(shí),bounds的size會(huì)match到新的frame的size上望浩;center屬性也會(huì)match到新frame的center上辖所;
b) Set center屬性時(shí),frame的original值也會(huì)相應(yīng)改變
c) Set bounds的size屬性時(shí)磨德,frame的size屬性也會(huì)match到bounds的size屬性上缘回。 - Points vs Pixels。在iOS中典挑,所有坐標(biāo)值和距離都是浮點(diǎn)數(shù)酥宴,引用為points。
- 一個(gè)points未必對(duì)應(yīng)到屏幕上的一個(gè)pixel您觉。
- 自定義的部分事件部分如下:
a) Event-handling拙寡,例如touchBegan—touchesMoved—touchesEnded—touchesCancelled
b) LayoutSubviews
c) drawRect - drawRect:只有在你的view在運(yùn)行時(shí)變化并且使用了native技術(shù)例如UIKit或者Core Graphics等等做繪圖時(shí)才需要被使用。
- 不論哪一種content mode生效,你都可以強(qiáng)制使用setNeedsDisplay或者setNeedsDisplayInRect來(lái)重繪內(nèi)容。
- 一個(gè)window對(duì)象有很多職責(zé):
a) 包含了app的可視對(duì)象
b) 承載了你的view和其它app對(duì)象的touch事件
c) 和你的app的vc一起工作脂男,促進(jìn)方向的改變 - UIWindowDidBecomeKeyNotification和UIWindowDidResignKeyNotification通知幫助你的app去鎖定哪一個(gè)window是key window,也就是接收鍵盤(pán)時(shí)間和其它touch相關(guān)事件的window飒硅。
- 另一個(gè)可以添加subviews到一個(gè)view體系里的就是loadView或viewDidLoad方法。
- 切記,如果你remove了一個(gè)子view并且計(jì)劃將來(lái)要重用,一定要重新retain這個(gè)子view始赎。因?yàn)閞emoveFromSuperview會(huì)autorelease一個(gè)subview,在真正移除之前仔燕。所以如果你不在下一個(gè)事件loop cycle之前retain這個(gè)view极阅,view可能會(huì)被release掉。
- Convert…: fromView:方法會(huì)從其它view的坐標(biāo)系系統(tǒng)轉(zhuǎn)換為local當(dāng)前view的坐標(biāo)系系統(tǒng)涨享。如果你指定nil為上述方法的參數(shù),轉(zhuǎn)換會(huì)將對(duì)應(yīng)的坐標(biāo)系落在包含view的window上仆百。
- 當(dāng)實(shí)現(xiàn)一個(gè)可以拖動(dòng)的area時(shí)厕隧,需要經(jīng)常手動(dòng)給 子views布局。因?yàn)槿绻o可滾動(dòng)的內(nèi)容單獨(dú)一個(gè)大的scrollable內(nèi)容是不高效的俄周,app需要繼承一個(gè)root view來(lái)包含很多更小的title views吁讨。
- 每一個(gè)view對(duì)象都對(duì)應(yīng)了一個(gè)CALayer來(lái)管理展示層和動(dòng)畫(huà)層。
- 在自定義view時(shí)需要注意:
a) 決定好合適的初始化函數(shù):
如果是手動(dòng)編寫(xiě)峦朗,override initWithFrame:方法
如果是從nib文件讀取建丧,override initWithCoder方法。
b) 實(shí)現(xiàn)dealloc方法去處理自定義data的清理問(wèn)題
c) 處理自定義繪制波势,覆蓋drawrect方法翎朱。
d) 如果view管理很多子view橄维,那么:
i.在init序列里創(chuàng)建這些view
ii.如果view需要自定義布局,則override layoutSubviews方法并將布局方法放在那里拴曲。 - 很多屬性可以允許你是使用覆蓋過(guò)的方法争舞,例如contentMode設(shè)置為contentStrech屬性,可以改變最終render的結(jié)果澈灼,并且可以去由你自己redraw內(nèi)容竞川。
- 改變一個(gè)view的subview的animation方法:在iOS4后,使用transitionWithView:duration:options:animations:completion:方法去初始化一個(gè)view的變化過(guò)渡叁熔。在block中傳入此方法委乌,則會(huì)改變涉及到showing,hiding,adding,removing子view的方法。
- 將一個(gè)View替換為另一個(gè)View的animation:在iOS4以后荣回,可以通過(guò)transitionFromView:toView:duration:options:completion:方法來(lái)在兩個(gè)views中切換遭贸。這個(gè)方法通常會(huì)remove第一個(gè)view,切換為第二個(gè)view驹马,所以如果你還想使用第一個(gè)view革砸,最好做好retain。
View官方文檔
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)阎肝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挤渔,“玉大人,你說(shuō)我怎么就攤上這事风题∨械迹” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵沛硅,是天一觀的道長(zhǎng)眼刃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)摇肌,這世上最難降的妖魔是什么擂红? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮围小,結(jié)果婚禮上昵骤,老公的妹妹穿的比我還像新娘树碱。我一直安慰自己,他們只是感情好涉茧,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布赴恨。 她就那樣靜靜地躺著,像睡著了一般伴栓。 火紅的嫁衣襯著肌膚如雪伦连。 梳的紋絲不亂的頭發(fā)上,一...
- 那天钳垮,我揣著相機(jī)與錄音惑淳,去河邊找鬼。 笑死饺窿,一個(gè)胖子當(dāng)著我的面吹牛歧焦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肚医,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼绢馍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肠套?” 一聲冷哼從身側(cè)響起舰涌,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎你稚,沒(méi)想到半個(gè)月后瓷耙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡刁赖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年搁痛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇弛。...
- 正文 年R本政府宣布病苗,位于F島的核電站,受9級(jí)特大地震影響症汹,放射性物質(zhì)發(fā)生泄漏硫朦。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一背镇、第九天 我趴在偏房一處隱蔽的房頂上張望咬展。 院中可真熱鬧泽裳,春花似錦、人聲如沸破婆。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祷舀。三九已至瀑梗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裳扯,已是汗流浹背抛丽。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冤吨,于是被迫代替她去往敵國(guó)和親蒿柳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- View Architecture Fundamentals 一漩蟆、視圖架構(gòu)基礎(chǔ) Most of the thing...
- View Geometry and Coordinate Systems 二垒探、視圖幾何和坐標(biāo)系統(tǒng) The defa...
- View and Window Architecture View Architecture Fundamenta...
- 天氣漸漸不那么熱了。最近開(kāi)始每天早上練習(xí)太極爆安,雖然只會(huì)練習(xí)非常簡(jiǎn)單的幾個(gè)動(dòng)作叛复,但感覺(jué)還是很好。那種慢下來(lái)扔仓,專(zhuān)注帶給...