干貨-UIView你知道多少(轉(zhuǎn))

曾經(jīng)有人這么說(shuō)過(guò)证九,在iphone里你看到的,摸到的椭微,都是UIView,所以UIView在iphone開(kāi)發(fā)里具有非常重要的作用盲链。那么UIView我們到底知道多少呢蝇率。請(qǐng)看看下面的問(wèn)題

如果這些你都知道,那么本文章的內(nèi)容就請(qǐng)繞道匈仗,如果你還不太清楚瓢剿,我想看了下面的內(nèi)容逢慌,你就明白了悠轩。

1.bounds和frame分別表示什么?
2.ContentMode里UIViewContentModeScaleToFill代表什么攻泼?
3.contentStretch 里的指定UIView里縮放區(qū)域是如何計(jì)算的火架?
4.UIVIew里的哪些屬性變化可以用動(dòng)畫(huà)來(lái)呈現(xiàn)?
5.UIKit的坐標(biāo)系和Core Graphics的坐標(biāo)系的差別是什么何鸡?

視圖和窗口展示了應(yīng)用的用戶界面牛欢,同時(shí)負(fù)責(zé)界面的交互。UIKit和其他系統(tǒng)框架提供了很多視圖傍睹,你可以就地使用而幾乎不需要修改。當(dāng)你需要展示的內(nèi)容與標(biāo)準(zhǔn)視圖允許的有很大的差別時(shí)拾稳,你也可以定義自己的視圖。

不管你是使用系統(tǒng)的視圖還是創(chuàng)建自己的視圖访得,你需要理解UIView和UIWindow類所提供的基本結(jié)構(gòu)龙亲。這些類提供了復(fù)雜的方法來(lái)管理視圖的布局和展示鳄炉。理解這些方法的工作非常重要,使你在應(yīng)用發(fā)生改變時(shí)可以確認(rèn)視圖有合適的行為泥技。

** 視圖架構(gòu) fundamentals **

大部分你想要可視化操作都是由視圖對(duì)象-即UIView類的實(shí)例-來(lái)進(jìn)行的珊豹。一個(gè)視圖對(duì)象定義了一個(gè)屏幕上的一個(gè)矩形區(qū)域店茶,同時(shí)處理該區(qū)域的繪制和觸屏事件劫恒。一個(gè)視圖也可以作為其他視圖的父視圖,同時(shí)決定著這些子視圖的位置和大小丛楚。UIView類做了大量的工作去管理這些內(nèi)部視圖的關(guān)系趣些,但是需要的時(shí)候你也可以定制默認(rèn)的行為贰您。

視圖與Core Animation層聯(lián)合起來(lái)處理著視圖內(nèi)容的解釋和動(dòng)畫(huà)過(guò)渡。每個(gè)UIKit框架里的視圖都被一個(gè)層對(duì)象支持(通常是一個(gè)CALayer類的實(shí)例)锦亦,它管理管理著后臺(tái)的視圖存儲(chǔ)和處理視圖相關(guān)的動(dòng)畫(huà)杠园。然而抛蚁,當(dāng)你需要對(duì)視圖的解釋和動(dòng)畫(huà)行為有更多的控制權(quán)時(shí),你可以使用層孵延。

為了理解視圖和層之間的關(guān)系尘应,我們可以借助于一些例子犬钢。圖1-1顯示了ViewTransitions樣例程序的視圖層次及其對(duì)底層Core Animation層的關(guān)系玷犹。應(yīng)用中的視圖包括了一個(gè)window(同時(shí)也是一個(gè)視圖)歹颓,一個(gè)通用的表現(xiàn)得像一個(gè)容器視圖的UIView對(duì)象巍扛,一個(gè)圖像視圖撤奸,一個(gè)控制顯示用的工具條胧瓜,和一個(gè)工具條按鈕(它本身不是一個(gè)視圖但是在內(nèi)部管理著一個(gè)視圖)府喳。(注意這個(gè)應(yīng)用包含了一個(gè)額外的圖像視圖,它是用來(lái)實(shí)現(xiàn)動(dòng)畫(huà)的)肉津。為了簡(jiǎn)化,同時(shí)因?yàn)檫@個(gè)視圖通常是被隱藏的熟吏,所以沒(méi)把它包含在下面的圖中牵寺。每個(gè)視圖都有一個(gè)相應(yīng)的層對(duì)象帽氓,它可以通過(guò)視圖礶r屬性被訪問(wèn)黎休。(因?yàn)楣ぞ邨l按鈕不是一個(gè)視圖势腮,你不能直接訪問(wèn)它的層對(duì)象捎拯。)在它們的層對(duì)象之后是Core Animation的解釋對(duì)象署照,最后是用來(lái)管理屏幕上的位的硬件緩存建芙。

Figure 1-1 View architecture

使用Core Animation的層對(duì)象有很重要的性能意義岁钓。一個(gè)視圖對(duì)象的繪制代碼需要盡量的少被調(diào)用,當(dāng)它被調(diào)用時(shí)品嚣,其繪制結(jié)果會(huì)被Core Animation緩存起來(lái)并在往后可以被盡可能的重用翰撑。重用已經(jīng)解釋過(guò)的內(nèi)容消除了通常需要更新視圖的開(kāi)銷(xiāo)昂貴的繪制周期眶诈。內(nèi)容的重用在動(dòng)畫(huà)中特別重要逝撬,我們可以使用已有的內(nèi)容乓土,這樣比創(chuàng)建新的內(nèi)容開(kāi)銷(xiāo)更小趣苏。

視圖層次和子視圖管理

除了提供自己的內(nèi)容之外食磕,一個(gè)視圖也可以表現(xiàn)得像一個(gè)容器彬伦。當(dāng)一個(gè)視圖包含其他視圖時(shí),就在兩個(gè)視圖之間創(chuàng)建了一個(gè)父子關(guān)系日戈。在這個(gè)關(guān)系中孩子視圖被當(dāng)作子視圖浙炼,父視圖被當(dāng)作超視圖弯屈。創(chuàng)建這樣一個(gè)關(guān)系對(duì)應(yīng)用的可視化和行為都有重要的意義资厉。

在視覺(jué)上宴偿,子視圖隱藏了父視圖的內(nèi)容窄刘。如果子視圖是完全不透明的娩践,那么子視圖所占據(jù)的區(qū)域就完全的隱藏了父視圖的相應(yīng)區(qū)域翻伺。如果子視圖是部分透明的吨岭,那么兩個(gè)視圖在顯示在屏幕上之前就混合在一起了未妹。每個(gè)父視圖都用一個(gè)有序的數(shù)組存儲(chǔ)著它的子視圖,存儲(chǔ)的順序會(huì)影響到每個(gè)子視圖的顯示效果歪赢。如果兩個(gè)兄弟子視圖重疊在一起埋凯,后來(lái)被加入的那個(gè)(或者說(shuō)是排在子視圖數(shù)組后面的那個(gè))出現(xiàn)在另一個(gè)上面白对。

父子視圖關(guān)系也影響著一些視圖行為甩恼。改變父視圖的尺寸會(huì)連帶著改變子視圖的尺寸和位置条摸。在這種情況下钉蒲,你可以通過(guò)合適的配置視圖來(lái)重定義子視圖的尺寸踏枣。其他會(huì)影響到子視圖的改變包括隱藏父視圖钙蒙,改變父視圖的alpha值仪搔,或者轉(zhuǎn)換父視圖烤咧。

視圖層次的安排也會(huì)決定著應(yīng)用如何去響應(yīng)事件煮嫌。在一個(gè)具體的視圖內(nèi)部發(fā)生的觸摸事件通常會(huì)被直接發(fā)送到該視圖去處理昌阿。然而懦冰,如果該視圖沒(méi)有處理刷钢,它會(huì)將該事件傳遞給它的父視圖内地,在響應(yīng)者鏈中以此類推。具體視圖可能也會(huì)傳遞事件給一個(gè)干預(yù)響應(yīng)者對(duì)象举农,像視圖控制器并蝗。如果沒(méi)有對(duì)象處理這個(gè)事件滚停,它最終會(huì)到達(dá)應(yīng)用對(duì)象键畴,此時(shí)通常就被丟棄了起惕。
獲取更多關(guān)于如何創(chuàng)建視圖層次惹想,查看 creating and managing a view hierarchy

視圖繪制周期

UIView類使用一個(gè)點(diǎn)播繪制模型來(lái)展示內(nèi)容。當(dāng)一個(gè)視圖第一次出現(xiàn)在屏幕前锋叨,系統(tǒng)會(huì)要求它繪制自己的內(nèi)容娃磺。在該流程中偷卧,系統(tǒng)會(huì)創(chuàng)建一個(gè)快照听诸,這個(gè)快照是出現(xiàn)在屏幕中的視圖內(nèi)容的可見(jiàn)部分。如果你從來(lái)沒(méi)有改變視圖的內(nèi)容派任,這個(gè)視圖的繪制代碼可能永遠(yuǎn)不會(huì)再被調(diào)用掌逛。這個(gè)快照?qǐng)D像在大部分涉及到視圖的操作中被重用豆混。

如果你確實(shí)改變了視圖內(nèi)容皿伺,也不會(huì)直接的重新繪制視圖內(nèi)容鸵鸥。相反,使用setNeedsDisplay或者setNeedsDisplayInRect:方法廢止該視圖讼油,同時(shí)讓系統(tǒng)在稍候重畫(huà)內(nèi)容矮台。系統(tǒng)等待當(dāng)前運(yùn)行循環(huán)結(jié)束嘿架,然后開(kāi)始繪制操作耸彪。這個(gè)延遲給了你一個(gè)機(jī)會(huì)來(lái)廢止多個(gè)視圖,從你的層次中增加或者刪除視圖召川,隱藏荧呐,重設(shè)大小和重定位視圖倍阐。所有你做的改變會(huì)稍候在同一時(shí)間反應(yīng)峰搪。
注意:改變一個(gè)視圖的幾何結(jié)構(gòu)不會(huì)自動(dòng)引起系統(tǒng)重畫(huà)內(nèi)容使套。視圖的contentMode屬性決定了改變幾何結(jié)構(gòu)應(yīng)該如果解釋侦高。大部分內(nèi)容模式在視圖的邊界內(nèi)拉伸或者重定位了已有快照奉呛,它不會(huì)重新創(chuàng)建一個(gè)新的快照。獲取更多關(guān)于內(nèi)容模式如果影響視圖的繪制周期馁痴,查看 content modes

當(dāng)繪制視圖內(nèi)容的時(shí)候到了時(shí)罗晕,真正的繪制流程會(huì)根據(jù)視圖及其配置改變。系統(tǒng)視圖通常會(huì)實(shí)現(xiàn)私有的繪制方法來(lái)解釋它們的視圖茫叭,(那些相同的系統(tǒng)視圖經(jīng)常開(kāi)發(fā)接口呐萨,好讓你可以用來(lái)配置視圖的真正表現(xiàn)莽囤。)對(duì)于定制的UIView子類朽缎,你通潮被啵可以覆蓋drawRect:方法并使用該方法來(lái)繪制你的視圖內(nèi)容羡儿。也有其他方法來(lái)提供視圖內(nèi)容掠归,像直接在底部的層設(shè)置內(nèi)容,但是覆蓋drawRect:時(shí)最通用的技術(shù)

內(nèi)容模式

視圖的內(nèi)容模式控制著視圖如何回收內(nèi)容來(lái)響應(yīng)視圖幾何結(jié)構(gòu)的變化厨相,也控制著是否需要回收內(nèi)容蛮穿。當(dāng)一個(gè)視圖第一次顯示時(shí),它通常會(huì)解釋內(nèi)容府适,其結(jié)果會(huì)被底層的層級(jí)樹(shù)捕獲為一張位圖肺樟。在那之后疟暖,改變視圖的幾何結(jié)構(gòu)不會(huì)導(dǎo)致重新創(chuàng)建位圖俐巴。相反窜骄,視圖中contentMode屬性的值決定著這張位圖是否該被拉伸邻遏,以適應(yīng)新的邊界或者只是簡(jiǎn)單的被放到角落或者視圖的邊界赎线。

視圖的內(nèi)容模式在你進(jìn)行如下操作時(shí)被應(yīng)用:

1.改變視圖frame或者bounds矩形的寬度或者高度時(shí)垂寥。
2.賦值給視圖的transform屬性,新的轉(zhuǎn)換包括一個(gè)放縮因子文判。

大部分視圖的contentMode值是UIViewContentModeScaleToFiill,它使視圖的內(nèi)容被放縮到適合新框架的值室梅。Figure 1-2展示了使用其他可用的內(nèi)容模式的結(jié)果戏仓。正如你在圖中所看到的那樣,不是所有的內(nèi)容模式都可以填充視圖的范圍亡鼠,可以的模式可能會(huì)扭曲內(nèi)容赏殃。

內(nèi)容模式很好的支持了視圖的內(nèi)容回收,但是當(dāng)你想視圖在放縮和重設(shè)尺寸的操作中重繪你也可以用UIViewContentModeRedraw內(nèi)容模式仁热。設(shè)置這個(gè)值繪強(qiáng)制系統(tǒng)調(diào)用視圖的drawRect:方法來(lái)響應(yīng)幾何結(jié)構(gòu)的變化。通常來(lái)講浑厚,你應(yīng)該盡可能的避免使用這個(gè)模式股耽,同時(shí)你不應(yīng)該在標(biāo)準(zhǔn)的系統(tǒng)視圖中使用這個(gè)模式。

獲取更多骨干與可用的內(nèi)容模式钳幅,查看UIView Class Reference

Figure 1-2

拉伸視圖

你可以指定視圖的某部分為可拉伸的物蝙,以便當(dāng)視圖的尺寸改變時(shí)只有可拉伸的部分被影響到「壹瑁可拉伸的部分通常給按鈕或者其他的部分為重復(fù)模式的視圖诬乞。由你指定的可拉伸區(qū)域允許沿著兩條或者其中一條軸拉伸。當(dāng)然钠导,當(dāng)一個(gè)視圖沿著兩條軸拉伸的時(shí)候震嫉,視圖的邊界必須也定義了一個(gè)重復(fù)的模式來(lái)避免任何的扭曲。Figure1-3展示了這種扭曲在視圖里是怎么表現(xiàn)自己的牡属。每個(gè)視圖里的原始像素的顏色都自我復(fù)制票堵,以便可以填充更大視圖的相應(yīng)區(qū)域。

Figure 1-3 拉伸一個(gè)按鈕的背景

你可以用contentStretch屬性來(lái)定義一個(gè)視圖的可拉伸區(qū)域逮栅。這個(gè)屬性的值一個(gè)邊的值被標(biāo)準(zhǔn)化為0.0到1.0之間的矩形悴势。當(dāng)拉伸這個(gè)視圖時(shí)窗宇,系統(tǒng)將視圖的當(dāng)前邊界值和放縮因子乘以標(biāo)準(zhǔn)值,以便決定哪些像素需要被拉伸特纤。使用標(biāo)準(zhǔn)值可以減輕每次改變視圖的邊界值都更新contentStretch屬性的需要军俊。

視圖的內(nèi)容模式也在決定如何視圖的可拉伸區(qū)域的使用中扮演著重要的角色。只有當(dāng)內(nèi)容模式可能繪引起視圖內(nèi)容放縮的時(shí)候可拉伸區(qū)域才會(huì)被使用捧存。這意味這你的可拉伸視圖只被UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit和UIViewContentModeScaleAspectFill內(nèi)容模式粪躬。如果你指定了一個(gè)將內(nèi)容彈到邊界或者角落的內(nèi)容模式(這樣就沒(méi)有真正的放縮內(nèi)容),這個(gè)視圖會(huì)忽視可拉伸區(qū)域昔穴。

注意:當(dāng)需要?jiǎng)?chuàng)建一個(gè)可拉伸UIImage對(duì)象作為視圖的背景時(shí)镰官,使用contentStretch屬性是推薦的∩悼В可拉伸視圖完全被Core Animation層處理朋魔,這樣性能通常更好岖研。

嵌入式動(dòng)畫(huà)支持

使用層對(duì)象來(lái)支持視圖的其中一個(gè)利益是你可以輕松的用動(dòng)畫(huà)處理視圖相關(guān)的改變卿操。動(dòng)畫(huà)是與用戶進(jìn)行信息交流的一個(gè)有用的方法,而且應(yīng)該總是在進(jìn)行應(yīng)用設(shè)計(jì)的過(guò)程中考慮使用動(dòng)畫(huà)孙援。UIView類的很多屬性是動(dòng)畫(huà)化的-也就是害淤,可以半自動(dòng)的從一個(gè)值動(dòng)畫(huà)的變化到另一個(gè)值。為了實(shí)現(xiàn)這樣一個(gè)動(dòng)畫(huà)拓售,你需要做的只是:

1 告訴UIKit你想要實(shí)現(xiàn)一個(gè)動(dòng)畫(huà)
2 改變這個(gè)屬性的值

在一個(gè)UIView對(duì)象中有以下的動(dòng)畫(huà)化屬性:

frame - 你可以使用這個(gè)來(lái)動(dòng)畫(huà)的改變視圖的尺寸和位置
bounds - 使用這個(gè)可以動(dòng)畫(huà)的改變視圖的尺寸
center - 使用這個(gè)可以動(dòng)畫(huà)的改變視圖的位置
transform - 使用這個(gè)可以翻轉(zhuǎn)或者放縮視圖
alpha - 使用這個(gè)可以改變視圖的透明度
backgroundColor - 使用這個(gè)可以改變視圖的背景顏色
contentStretch - 使用這個(gè)可以改變視圖內(nèi)容如何拉伸

動(dòng)畫(huà)的一個(gè)很重要的地方是用于從一組視圖到另一組視圖的過(guò)渡窥摄。通常來(lái)說(shuō),會(huì)用一個(gè)視圖控制器來(lái)管理關(guān)系到用戶界面的主要變更的動(dòng)畫(huà)础淤。例如崭放,涉及到從高層到底層信息的導(dǎo)航的界面,通常會(huì)使用一個(gè)導(dǎo)航控制器來(lái)管理視圖的過(guò)渡鸽凶,這些視圖顯示了數(shù)據(jù)的每一個(gè)連續(xù)層面币砂。然而,你也可以使用動(dòng)畫(huà)來(lái)創(chuàng)建兩組視圖的過(guò)渡玻侥,而不是視圖控制器决摧。當(dāng)你想用一個(gè)系統(tǒng)提供的視圖控制器無(wú)法支持的導(dǎo)航方案時(shí)你可能會(huì)這樣做。

除了用UIKit類可以創(chuàng)建動(dòng)畫(huà)外凑兰,你也可以用Core Animation層來(lái)創(chuàng)建動(dòng)畫(huà)掌桩。在更低層你有更多的在時(shí)間或者動(dòng)畫(huà)屬性上的控制權(quán)。

獲取更多關(guān)于如何創(chuàng)建一個(gè)基于視圖的動(dòng)畫(huà)姑食,查看 Animations
獲取更多關(guān)于使用Core Animation創(chuàng)建動(dòng)畫(huà)的信息波岛,查看Core Animation Programming Guide和Core Animation Cookbook.

視圖幾何結(jié)構(gòu)和坐標(biāo)系統(tǒng)

UIKit的默認(rèn)坐標(biāo)系統(tǒng)把原點(diǎn)設(shè)置在左上角,兩條軸往下和右擴(kuò)展音半。做標(biāo)志被表示為浮點(diǎn)數(shù)则拷,這樣允許內(nèi)容的精確布局和定位而不管底層的屏幕灰蛙。Figure1-4展示了相對(duì)于屏幕的坐標(biāo)系統(tǒng)。除了屏幕坐標(biāo)系統(tǒng)窗口和視圖也定義了它們自己的本地坐標(biāo)系統(tǒng)隔躲,這樣允許你指定相對(duì)于視圖或者窗口原點(diǎn)的坐標(biāo)而不是屏幕摩梧。

Figure 1-4 UIKit中的坐標(biāo)系統(tǒng)

因?yàn)槊總€(gè)視圖和窗口都定義了它自己的本地坐標(biāo)系統(tǒng),你需要留意在任何時(shí)間內(nèi)是哪個(gè)坐標(biāo)系統(tǒng)在起作用宣旱。每次繪制或者改變一個(gè)視圖都是基于一個(gè)坐標(biāo)系統(tǒng)的仅父。在某些繪制中會(huì)基于視圖本身的坐標(biāo)系統(tǒng)。在某些幾何結(jié)構(gòu)變更中是基于父視圖的坐標(biāo)系統(tǒng)的浑吟。UIWindow和UIView類都包含了幫助你從一個(gè)坐標(biāo)系統(tǒng)轉(zhuǎn)換到另一個(gè)的方法笙纤。

重要:一些iOS技術(shù)定義了默認(rèn)的坐標(biāo)系統(tǒng),它們的原點(diǎn)和方向與UIKit的不同组力。省容;例如,Core Graphics和OpenGL ES的坐標(biāo)系統(tǒng)是原點(diǎn)在可視區(qū)域的左下角燎字,而y軸往上遞增腥椒。當(dāng)繪制或者創(chuàng)建內(nèi)容時(shí),你的代碼應(yīng)該考慮到一些不同并且適應(yīng)坐標(biāo)值候衍。

frame, bounds和center屬性之間的關(guān)系:

視圖對(duì)象使用frame, bounds和center屬性來(lái)跟蹤它的尺寸和位置:
frame屬性包含了frame矩形笼蛛,指定了在父視圖坐標(biāo)系統(tǒng)中該視圖的尺寸和位置。
center屬性包含了在父視圖坐標(biāo)系統(tǒng)中的已知中心點(diǎn)蛉鹿。
bounds屬性包含了邊界矩形滨砍,指定了在視圖本地坐標(biāo)系統(tǒng)中視圖的尺寸。

主要使用center和frame屬性來(lái)控制當(dāng)前視圖的幾何結(jié)構(gòu)妖异。例如惋戏,當(dāng)在運(yùn)行時(shí)構(gòu)建你的視圖層次或者改變視圖的尺寸或者位置時(shí)你可以使用這些屬性。如果你只是要改變視圖的位置他膳,那么推薦使用center屬性响逢。center屬性的值永遠(yuǎn)是可用的,即使添加了放縮或者轉(zhuǎn)換因子到視圖的轉(zhuǎn)換矩陣當(dāng)中矩乐。但是對(duì)于frame屬性卻不是龄句,當(dāng)視圖的轉(zhuǎn)換矩形不等于原始矩陣時(shí)它被當(dāng)作時(shí)無(wú)效的。

在繪制的過(guò)程中主要使用bounds屬性散罕。這個(gè)邊界矩陣在視圖的本地坐標(biāo)系統(tǒng)被解釋分歇。這個(gè)矩形的默認(rèn)原點(diǎn)是(0, 0)欧漱,它的尺寸也適應(yīng)frame矩形的尺寸职抡。任何繪制在這個(gè)矩形當(dāng)中的東西都是該視圖的可視內(nèi)容的一部分。如果你改變了bounds矩形的原點(diǎn)误甚,任何你繪制在新矩形的東西都會(huì)變成該視圖可視內(nèi)容的一部分缚甩。

Figure1-5展示了一個(gè)圖像視圖的frame和bounds矩形之間的關(guān)系谱净。圖中,圖像視圖的右上角被定位在父視圖坐標(biāo)系統(tǒng)的(40擅威, 40)壕探,它的矩形尺寸為240x380。對(duì)于bounds矩形郊丛,原點(diǎn)是(0李请, 0),矩形尺寸也是240x380厉熟。

Figure 1-5 視圖frame和bounds之間的關(guān)系

即使你可以獨(dú)立的改變frame导盅,bounds和center屬性,其中一個(gè)改變還是會(huì)影響到另外兩個(gè)屬性:

1.當(dāng)你設(shè)置了frame屬性揍瑟,bounds屬性的尺寸值也改變來(lái)適應(yīng)frame矩形的新尺寸。center屬性也會(huì)改變?yōu)樾耭rame矩形的中心值滤馍。
2.當(dāng)你設(shè)置了center屬性杉畜,frame的原點(diǎn)也會(huì)相應(yīng)的改變纪蜒。
3.當(dāng)你設(shè)置了bounds屬性,frame屬性會(huì)改變以適應(yīng)bounds矩形的新尺寸。

視圖的框架默認(rèn)不會(huì)被它的父視圖框架裁剪随珠。這樣的化,任何放置在父視圖外的子視圖都會(huì)被完整的解釋窗看。你可以改變這種行為茸歧,改變父視圖的clipsToBounds屬性就可以显沈。不管子視圖是否在視覺(jué)上被裁剪,觸屏事件總是發(fā)生在目標(biāo)視圖父視圖的bounds矩形拉讯。換句話說(shuō)魔慷,如果觸摸位于父視圖外的那部分視圖,那么該事件不會(huì)被發(fā)送到該視圖院尔。

坐標(biāo)系統(tǒng)轉(zhuǎn)換矩陣

坐標(biāo)系統(tǒng)轉(zhuǎn)換矩陣給改變視圖(或者是它的視圖)提供了一個(gè)輕松和簡(jiǎn)易的方法。一個(gè)仿射轉(zhuǎn)換是一個(gè)數(shù)學(xué)矩陣纵顾,它指定了在坐標(biāo)系統(tǒng)中的點(diǎn)是怎么被映射到另一個(gè)坐標(biāo)系統(tǒng)中的點(diǎn)。你可以對(duì)整個(gè)視圖應(yīng)用仿射轉(zhuǎn)換幻林,以基于其父視圖來(lái)改變視圖的尺寸音念,位置或者朝向。你也可以在你的繪制代碼中應(yīng)用仿射轉(zhuǎn)換整葡,以對(duì)已解釋內(nèi)容的獨(dú)立部分實(shí)現(xiàn)相同的操控讥脐。如何應(yīng)用仿射轉(zhuǎn)換是基于這樣的上下文的:

為了修改整個(gè)視圖旬渠,可以修改視圖transform屬性的仿射轉(zhuǎn)換值俱萍。

為了在視圖中的drawRect:方法中修改內(nèi)容的指定部分,可以修改與當(dāng)前圖形上下文相關(guān)的仿射轉(zhuǎn)換告丢。

當(dāng)你想實(shí)現(xiàn)動(dòng)畫(huà)時(shí)枪蘑,通翅猓可以修改視圖的transform屬性值。例如话侧,你可以使用這個(gè)屬性來(lái)制作一個(gè)視圖圍繞中心點(diǎn)翻轉(zhuǎn)的動(dòng)畫(huà)闯参。你不應(yīng)該在其父視圖的坐標(biāo)空間中用這個(gè)屬性來(lái)永久的改變你的視圖,像修改它的位置和尺寸新博。對(duì)于這種類型的改變释移,你可以修改視圖的frame矩形。
注意:當(dāng)修改視圖的transform屬性值時(shí)嚼贡,所有的轉(zhuǎn)換都是基于視圖的中心點(diǎn)來(lái)實(shí)現(xiàn)的同诫。

在視圖的drawRect:方法中误窖,你可以使用仿射轉(zhuǎn)換來(lái)定位或者翻轉(zhuǎn)你想要繪制的項(xiàng)目。相對(duì)于在視圖某些部位中修正對(duì)象的位置柔吼,我們更傾向于相對(duì)于一個(gè)固定點(diǎn)去創(chuàng)建對(duì)象丙唧,通常是(0想际, 0),同時(shí)在繪制之前使用轉(zhuǎn)換來(lái)定位對(duì)象牌柄。這樣的話侧甫,如果在視圖中對(duì)象的位置改變了闺骚,你要做的只是修改轉(zhuǎn)換矩陣,這樣比為對(duì)象重新創(chuàng)建新的位置性能更好開(kāi)銷(xiāo)更低。你可以通過(guò)使用CGContextGetCTM方法來(lái)獲取關(guān)于圖形上下文的仿射轉(zhuǎn)換胸梆,同時(shí)可以用Core Graphics的相關(guān)方法在繪制中來(lái)設(shè)置或者修改這個(gè)轉(zhuǎn)換矩陣须板。

當(dāng)前轉(zhuǎn)換矩陣(CTM)是一個(gè)在任何時(shí)候都被使用的仿射矩陣。當(dāng)操控整個(gè)視圖的幾何結(jié)構(gòu)時(shí)绪颖,CTM就是視圖transform屬性的值柠横。在drawRect:方法中,CTM是關(guān)于圖形上下文的仿射矩陣晨继。

每個(gè)子視圖的坐標(biāo)系統(tǒng)都是構(gòu)建在其祖先的坐標(biāo)系統(tǒng)之上的搬俊。所以當(dāng)你修改一個(gè)視圖的transform屬性唉擂,這個(gè)改變會(huì)影響到視圖及其所有的子視圖。然而腹缩,這些改變只會(huì)影響到屏幕上視圖的最終解釋卵凑。因?yàn)槊總€(gè)視圖都負(fù)責(zé)繪制自己的內(nèi)容和對(duì)自己的子視圖進(jìn)行布局勺卢,所以在繪制和布局的過(guò)程中它可以忽略父視圖的轉(zhuǎn)換。

Figure1- 6描述了在解釋的時(shí)候宴抚,兩個(gè)不同的轉(zhuǎn)換因子是如何在視覺(jué)上組合起來(lái)的甫煞。在視圖的drawRect:方法中抚吠,對(duì)一個(gè)形狀應(yīng)用一個(gè)45度的轉(zhuǎn)換因子會(huì)使該形狀翻轉(zhuǎn)指定的角度。另外加上一個(gè)45度的轉(zhuǎn)換因子會(huì)導(dǎo)致整個(gè)形狀翻轉(zhuǎn)90度喊式。這個(gè)形狀對(duì)于繪制它的視圖來(lái)講仍然只是翻轉(zhuǎn)了45度岔留,但是視圖自己的轉(zhuǎn)換讓它看起來(lái)像使翻轉(zhuǎn)了90度检柬。

Figure 1-6 翻轉(zhuǎn)一個(gè)視圖和它的內(nèi)容

重要:如果一個(gè)視圖的transform屬性不是其定義時(shí)轉(zhuǎn)換矩陣,那么視圖的frame屬性是未定義的而且必須被忽略进胯。當(dāng)對(duì)視圖應(yīng)用轉(zhuǎn)換時(shí)运悲,你必須使用視圖的bounds和center屬性來(lái)獲取視圖的位置和尺寸班眯。子視圖的frame矩形仍然是有效的,因?yàn)樗鼈兣c視圖的bounds相關(guān)宠能。

獲取更多關(guān)于在運(yùn)行時(shí)修改視圖的transform屬性磁餐,查看 “Translating, Scaling, and Rotating Views.”獲取更多如何在繪制過(guò)程中使用轉(zhuǎn)換來(lái)定位內(nèi)容诊霹,查看 Drawing and Printing Guide for iOS.

點(diǎn)與像素

在iOS中,所有的坐標(biāo)值和距離都被指定為使用浮點(diǎn)數(shù)伴箩,其單元值稱為點(diǎn)嗤谚。點(diǎn)的數(shù)量隨著設(shè)備的不同而不同怔蚌,而且彼此不相關(guān)桦踊。要明白關(guān)于點(diǎn)的最主要一點(diǎn)是它們提供了一個(gè)繪制用的固定框架。

Table 1-1 列出了不同iOS設(shè)備的分辨率(點(diǎn)度量)鳄橘。前為寬后為長(zhǎng)芒炼。只要你依照這些屏幕的尺寸來(lái)設(shè)計(jì)用戶界面本刽,你的視圖就回被相應(yīng)的設(shè)備正確顯示。

Table 1-1

Device Screen dimensions (in points)
iPhone and iPod touch 320 x 480
iPad 768 x 1024

每一種使用基于點(diǎn)度量系統(tǒng)的設(shè)備都定義了一個(gè)用戶坐標(biāo)空間暗挑。這是幾乎在你所有的代碼都會(huì)用到的標(biāo)準(zhǔn)坐標(biāo)空間炸裆。例如鲜屏,當(dāng)你要操控視圖的幾何結(jié)構(gòu)或者調(diào)用Core Graphics方法來(lái)繪制內(nèi)容時(shí)會(huì)用到點(diǎn)和用戶坐標(biāo)空間洛史。即使有時(shí)用戶坐標(biāo)空間里的坐標(biāo)時(shí)直接映射到設(shè)備屏幕的像素,你還是永遠(yuǎn)不應(yīng)該假設(shè)這是永遠(yuǎn)不變的土思。相反忆嗜,你應(yīng)該記桌痢:一個(gè)點(diǎn)并不一定對(duì)應(yīng)著屏幕上的一個(gè)像素

在設(shè)備層面,所有由你指定的視圖上的坐標(biāo)在某些點(diǎn)上必須被轉(zhuǎn)化成像素响谓。然而娘纷,從用戶坐標(biāo)空間上的點(diǎn)到設(shè)備坐標(biāo)空間上的像素通常由系統(tǒng)來(lái)處理跋炕。UIKit和Core Graphics都主要使用基于向量的繪制模型辐烂,所有的坐標(biāo)值都被指定為使用點(diǎn)。這樣胳嘲,如果你用Core Graphics畫(huà)了一條曲線了牛,你會(huì)用一些值來(lái)指定這條曲線,而不管底層屏幕使用怎樣的解決方法甫窟。

當(dāng)你需要處理圖像或者其他基于像素的技術(shù),像OpenGL ES時(shí)愈犹,iOS會(huì)幫你管理這些像素。對(duì)于存儲(chǔ)為應(yīng)用程序的束中的資源的靜態(tài)圖像文件台夺,iOS定義了一些約定颤介,可以指定不同像素密度的圖像,也可以在加載圖像時(shí)最大限度的適應(yīng)當(dāng)前屏幕的解決方案冤灾。視圖也提供了關(guān)于當(dāng)前放縮因子的信息韵吨,以便你可以適當(dāng)?shù)恼{(diào)整任何基于像素的繪制代碼來(lái)適應(yīng)有更高級(jí)解決方案的屏幕移宅。在不同屏幕的解決方案中處理基于像素內(nèi)容的技術(shù)可以在"Supporting High-Resolution Screens"和"Drawing and Printing Guide for iOS"找到描述漏峰。

**視圖的運(yùn)行時(shí)交互模型 **

當(dāng)用戶和界面進(jìn)行交互時(shí)浅乔,或者由代碼程序性的改變一些東西時(shí),一系列復(fù)雜的事件就會(huì)發(fā)生在UIKit的內(nèi)部來(lái)處理這些交互席噩。在這個(gè)系列中的某些點(diǎn)贤壁,UIKit喚出你的視圖類脾拆,同時(shí)給它們一個(gè)機(jī)會(huì)去響應(yīng)程序的行為给梅。理解這些喚出點(diǎn)對(duì)于理解視圖在哪里融入系統(tǒng)很重要。Figure 1-7 展示了這些事件的基本序列渔期,從用戶觸屏開(kāi)始到圖形系統(tǒng)更新屏幕內(nèi)容來(lái)響應(yīng)結(jié)束渴邦。同樣的事件序列也會(huì)發(fā)生在任何程序性啟動(dòng)的動(dòng)作谋梭。

Figure 1-7 UIKit 與視圖對(duì)象進(jìn)行交互

以下的步驟分解了圖1-7中的事件序列瓮床,既解釋了在每一步發(fā)生了什么,也解釋了應(yīng)用如何響應(yīng)

1.用戶觸屏
2.硬件報(bào)告觸摸事件給UIKit框架
3.UIKit框架將觸摸事件打包成UIEvent對(duì)象踢步,同時(shí)分發(fā)給適合的視圖获印。(對(duì)于UIKit框架如何提交事件給視圖的詳細(xì)解釋街州,查看 Event Handing Guide for iOS)
4.視圖中的事件處理代碼可能進(jìn)行以下的動(dòng)作來(lái)響應(yīng):

改變視圖或者其子視圖的屬性(frame唆缴, bounds, alpha蟆技, 等等)
調(diào)用setNeedsLayout方法以標(biāo)記該視圖(或者它的子視圖)為需要進(jìn)行布局更新
調(diào)用setNeedsDisplay或者setNeedsDisplayInRect:方法以標(biāo)記該視圖(或者它的子視圖)需要進(jìn)行重畫(huà)
通知一個(gè)控制器關(guān)于一些數(shù)據(jù)的更新
當(dāng)然质礼,哪些事情要做眶蕉,哪些方法要被調(diào)用是由視圖來(lái)決定的唧躲。

5.如果一個(gè)視圖的幾何結(jié)構(gòu)改變了,UIKit會(huì)根據(jù)以下幾條規(guī)則來(lái)更新它的子視圖:

a.如果自動(dòng)重設(shè)尺寸的規(guī)則在發(fā)生作用嵌器,UIKit會(huì)根據(jù)這些規(guī)則來(lái)調(diào)整視圖谐丢。獲取更多關(guān)于自動(dòng)重設(shè)尺寸規(guī)則如何工作乾忱,查看"Handling Layout Changes Automatically Using Autoresizing Rules."
b.如果視圖實(shí)現(xiàn)了layoutSubviews方法,UIKit會(huì)調(diào)用它衷佃。你可以在你的定制視圖中覆蓋這個(gè)方法同時(shí)用它來(lái)調(diào)整任何子視圖的位置和大小氏义。例如新蟆,一個(gè)提供了巨大滾動(dòng)區(qū)域的視圖會(huì)需要使用幾個(gè)子視圖作為“瓦塊”而不是創(chuàng)建一個(gè)不太可能放進(jìn)內(nèi)存的巨大視圖琼稻。在這個(gè)方法的實(shí)現(xiàn)中,視圖會(huì)隱藏任何屏幕外的子視圖鸠补,或者重定位它們?nèi)缓笥脕?lái)繪制新的可視內(nèi)容紫岩。作為這個(gè)流程的一部分睬塌,視圖的布局代碼也可以廢止任何需要被重畫(huà)的視圖揩晴。

6.如果任何視圖的任何部分被標(biāo)記為需要重畫(huà),UIKit會(huì)要求視圖重畫(huà)自身诅愚。
對(duì)于顯式的定義了drawRect:方法的定制視圖违孝,UIKit會(huì)調(diào)用這個(gè)方法雌桑。這方法的實(shí)現(xiàn)應(yīng)該盡快重畫(huà)視圖的指定區(qū)域,并且不應(yīng)該再做其他事轧飞。不要在這個(gè)點(diǎn)上做額外的布局撒踪,也不要改變應(yīng)用的數(shù)據(jù)模型制妄。提供這個(gè)方法僅僅是為了更新視圖的可視內(nèi)容耕捞。
標(biāo)準(zhǔn)的系統(tǒng)視圖通常不會(huì)實(shí)現(xiàn)drawRect:方法烫幕,但是也會(huì)在這個(gè)時(shí)候管理它們的繪制较曼。

7.任何已經(jīng)更新的視圖會(huì)與應(yīng)用余下的可視內(nèi)容組合在一起捷犹,同時(shí)被發(fā)送到圖形硬件去顯示。
8.圖形硬件將已解釋內(nèi)容轉(zhuǎn)化到屏幕上侣颂。

注意:上面的更新模型主要應(yīng)用于使用標(biāo)準(zhǔn)系統(tǒng)視圖和繪制技術(shù)的應(yīng)用憔晒。使用OpenGL ES來(lái)繪制的應(yīng)用通常會(huì)配置一個(gè)單一的全屏視圖和直接繪制相關(guān)的OpenGL圖像上下文蔑舞。你的視圖還是應(yīng)該處理觸屏事件斗幼,但是它是全屏的蜕窿,毋需給子視圖布局或者實(shí)現(xiàn)drawRect:方法呆馁。獲取更多關(guān)于使用OpenGL ES的信息浙滤,查看 OpenGL ES Programming Guide for iOS.

給定之前的一系列步驟纺腊,將自己的定制視圖整合進(jìn)去的方法包括:

事件處理方法:
1.touchesBegan:withEvent:
2.touchesMoved:withEvent:
3.touchesEnded:withEvent:
4.touchesCancelled:withEvent:
5.layoutSubviews方法
6.drawRect:方法

這些是視圖的最常用的覆蓋方法茎芭,但是你可能不需要覆蓋全部梅桩。如果你使用手勢(shì)識(shí)別來(lái)處理事件宿百,你不需要覆蓋事件處理方法。相似的雀费,如果你的視圖沒(méi)有包含子視圖或者它的尺寸不會(huì)改變盏袄,那就沒(méi)有理由去覆蓋layoutSubviews方法貌矿。最后罪佳,只有當(dāng)視圖內(nèi)容會(huì)在運(yùn)行時(shí)改變赘艳,同時(shí)你要用UIKit或者Core Graphics等本地技術(shù)來(lái)繪制時(shí)才需要用到drawRect蕾管。

要記住這些是主要的整合點(diǎn),但是不僅僅只有這些旭蠕。UIView類中有些方法是專門(mén)設(shè)計(jì)來(lái)給子類覆蓋的。你應(yīng)該到UIView Class Reference中查看這些方法的描述佑稠,以便在定制時(shí)清楚哪些方法適合給你覆蓋舌胶。

有效使用視圖的提示

當(dāng)你需要繪制一些標(biāo)準(zhǔn)系統(tǒng)視圖不能提供的內(nèi)容時(shí)幔嫂,定制視圖是很有用的誊薄。但是你要負(fù)責(zé)保證視圖的性能要足夠的高呢蔫。UIKit會(huì)盡可能的優(yōu)化視圖相關(guān)的行為,也會(huì)幫助你提高性能。然而定鸟,考慮一些提示可以幫助到UIKit。

重要:在調(diào)整繪制代碼之前著瓶,你應(yīng)該一直收集與你視圖當(dāng)前性能有關(guān)的數(shù)據(jù)联予。估量當(dāng)前性能讓你可以確定是否真的有問(wèn)題,同時(shí)如果真的有問(wèn)題材原,它也提供一個(gè)基線沸久,讓你在未來(lái)的優(yōu)化中可以比較。

視圖不會(huì)總是有一個(gè)相應(yīng)的視圖控制器
在應(yīng)用中余蟹,視圖和視圖控制器之間的一對(duì)一關(guān)系是很少見(jiàn)的卷胯。視圖控制器的工作是管理一個(gè)視圖層次威酒,而視圖層次經(jīng)常是包含了多個(gè)視圖窑睁,它們都有自包含特性。對(duì)于iPhone應(yīng)用葵孤,每個(gè)視圖層次通常都填滿了整個(gè)屏幕担钮,盡管對(duì)于iPad應(yīng)用來(lái)說(shuō)不是。

當(dāng)你設(shè)計(jì)用戶界面的時(shí)候尤仍,考慮到視圖控制器的所扮演的角色是很重要的箫津。視圖控制器提供了很多重要的行為,像協(xié)調(diào)視圖的展示,協(xié)調(diào)視圖的剔除苏遥,釋放內(nèi)存以響應(yīng)低內(nèi)存警告饼拍,還有翻轉(zhuǎn)視圖以響應(yīng)界面的方向變更。逃避這些行為會(huì)導(dǎo)致應(yīng)用發(fā)生錯(cuò)誤暖眼。
獲取更多關(guān)于視圖控制器的信息惕耕,查看 View Controller Programming Guide for iOS

最小化定制的繪畫(huà)

盡管定制的繪畫(huà)有時(shí)是需要的,但是你也應(yīng)該盡量避免它诫肠。真正需要定制繪畫(huà)的時(shí)候是已有的視圖類無(wú)法提供足夠的表現(xiàn)和能力時(shí)司澎。任何時(shí)候你的內(nèi)容都應(yīng)該可以被組裝到其他視圖,最好結(jié)果時(shí)組合那些視圖對(duì)象到定制的視圖層次

**利用內(nèi)容模式 **

內(nèi)容模式可以最小化重畫(huà)視圖要花費(fèi)的時(shí)間栋豫。默認(rèn)的挤安,視圖使用UIViewContentModeScaleToFill 內(nèi)容模式,這個(gè)模式會(huì)放縮視圖的已有內(nèi)容來(lái)填充視圖的frame矩形丧鸯。需要時(shí)你可以改變這個(gè)模式來(lái)調(diào)整你的內(nèi)容蛤铜,但是應(yīng)該避免使用UIViewContentModeRedraw內(nèi)容模式。不管哪個(gè)內(nèi)容模式發(fā)生作用丛肢,你都可以調(diào)用setNeedsDisplay或者setNeedsDisplayInRect:方法來(lái)強(qiáng)制視圖重畫(huà)它的內(nèi)容围肥。

可能的話將視圖聲明為不透明

UIKit使用opaque屬性來(lái)決定它是否可以優(yōu)化組合操作。將一個(gè)定制視圖的這個(gè)屬性設(shè)置為YES會(huì)告訴UIKit不需要解釋任何在該視圖后的內(nèi)容蜂怎。這樣可以為你的繪制代碼提高性能并且是推薦的穆刻。當(dāng)然,如果你將這個(gè)屬性設(shè)置為YES杠步,你的視圖一定要用不透明的內(nèi)容完全填充它的bounds矩形氢伟。

滾動(dòng)時(shí)調(diào)整視圖的繪制行為

滾動(dòng)會(huì)導(dǎo)致數(shù)個(gè)視圖在短時(shí)間內(nèi)更新。如果視圖的繪制代碼沒(méi)有被適當(dāng)?shù)恼{(diào)整幽歼,滾動(dòng)的性能會(huì)非常的緩慢朵锣。相對(duì)于總是保證視圖內(nèi)容的平庸,我們更傾向于考慮滾動(dòng)操作開(kāi)始時(shí)改變視圖行為甸私。例如诚些,你可以暫時(shí)減少已解釋的內(nèi)容,或者在滾動(dòng)的時(shí)候改變內(nèi)容模式颠蕴。當(dāng)滾動(dòng)停止時(shí)泣刹,你可以將視圖返回到前一狀態(tài),同時(shí)需要時(shí)更新內(nèi)容犀被。

**不要嵌入子視圖來(lái)定制控制 **

盡管在技術(shù)上增加子視圖到標(biāo)準(zhǔn)系統(tǒng)控制對(duì)象-繼承自UIControl的類-是可行的椅您,你還是永遠(yuǎn)不應(yīng)該用這種方法來(lái)定制它們」鸭控制對(duì)象支持定制掀泳,它們有顯式并且良好歸檔的接口雪隧。例如,UIButton類包含了設(shè)置標(biāo)題和背景圖片的方法员舵。使用已定義好的定制點(diǎn)意味著你的代碼總是會(huì)正確的工作脑沿。不用這些方法,而嵌入一個(gè)定制的圖像視圖或者標(biāo)簽到按鈕中去會(huì)導(dǎo)致應(yīng)用出現(xiàn)未預(yù)期的結(jié)果马僻。

以上內(nèi)容 為官方文檔翻譯(來(lái)源于網(wǎng)絡(luò))庄拇,如果你英文還可以,請(qǐng)看英文地址:英文地址
http://blog.csdn.net/mengtnt/article/details/6716289
UIView的剖析 總結(jié)的不錯(cuò)

轉(zhuǎn)載自http://www.cnblogs.com/likwo/archive/2011/06/18/2084192.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末韭邓,一起剝皮案震驚了整個(gè)濱河市措近,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌女淑,老刑警劉巖瞭郑,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸭你,居然都是意外死亡屈张,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)袱巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阁谆,“玉大人,你說(shuō)我怎么就攤上這事愉老〉严茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵俺夕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贱鄙,道長(zhǎng)劝贸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任逗宁,我火速辦了婚禮映九,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞎颗。我一直安慰自己件甥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哼拔。 她就那樣靜靜地躺著引有,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倦逐。 梳的紋絲不亂的頭發(fā)上譬正,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼曾我。 笑死粉怕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抒巢。 我是一名探鬼主播贫贝,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛉谜!你這毒婦竟也來(lái)了稚晚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悦陋,失蹤者是張志新(化名)和其女友劉穎蜈彼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俺驶,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幸逆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暮现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片还绘。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栖袋,靈堂內(nèi)的尸體忽然破棺而出拍顷,到底是詐尸還是另有隱情,我是刑警寧澤塘幅,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布昔案,位于F島的核電站,受9級(jí)特大地震影響电媳,放射性物質(zhì)發(fā)生泄漏踏揣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一匾乓、第九天 我趴在偏房一處隱蔽的房頂上張望捞稿。 院中可真熱鬧,春花似錦拼缝、人聲如沸娱局。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衰齐。三九已至,卻和暖如春继阻,著一層夾襖步出監(jiān)牢的瞬間娇斩,已是汗流浹背仁卷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犬第,地道東北人锦积。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歉嗓,于是被迫代替她去往敵國(guó)和親丰介。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Core Animation基礎(chǔ) Core Animation 利用了硬件加速和架構(gòu)上的優(yōu)化來(lái)實(shí)現(xiàn)快速渲染和實(shí)時(shí)動(dòng)...
    獨(dú)木舟的木閱讀 1,539評(píng)論 0 3
  • 天朗氣清鉴分,好天氣哮幢! 今天學(xué)校正式通知家長(zhǎng)們周二考試,各種囑咐志珍,比如要帶鉛筆橡皮直尺一類的橙垢,還有家長(zhǎng)們的各種擔(dān)心,我...
    王柯媽媽閱讀 261評(píng)論 0 0
  • 目錄:1伦糯、獲取當(dāng)前設(shè)備類型2柜某、獲取當(dāng)前語(yǔ)言環(huán)境3、獲取當(dāng)前APP版本號(hào) 1敛纲、獲取當(dāng)前設(shè)備類型 2喂击、獲取當(dāng)前語(yǔ)言環(huán)境...
    PZcoder閱讀 274評(píng)論 0 0
  • //獲取現(xiàn)在時(shí)間的秒鐘分鐘時(shí)鐘數(shù) NSDate * date=[[NSDate alloc]init]; NSDa...
    草莓拿鐵閱讀 324評(píng)論 0 1
  • 配色專題 常見(jiàn)問(wèn)題 整套幻燈片看起來(lái)很臟 整套幻燈片顏色太單調(diào) 不懂配色翰绊,有些內(nèi)容看不清楚 配色的作用 強(qiáng)化主題 ...
    馬騰Madao閱讀 1,498評(píng)論 0 7