翻譯_iOS視圖編程指南(View Programming Guide for iOS)之視圖和窗口體系

官方最新:View Programming Guide for iOS

圖片源自網絡

前言##

前些日子,我發布一個蘋果官方文檔的翻譯,之后就有不少同學朋友問我:翻譯蘋果官方文檔能做什么,開發過程用到的時候很少,浪費時間,還又沒什么用。今天,剛好有時間,就在此申明一下翻譯蘋果官方文檔的實質作用:

  • 首先,翻譯官方文檔可以提高自身英語閱讀能力和理解能力,增大自己的詞匯量,良好的英語基礎會讓工作效率更上一層樓的;
  • 其次,對于iOS開發而言,官方文檔可以讓你更好地理解每一個技術點實現的基本原理,知其然更要知其所以然,這樣對iOS開發的進階者和初學者都有很大的幫助;
  • 最后,翻譯官方文檔可以讓你更加全神貫注,寫代碼的過中會出現分神、思維混沌等現象,這時候翻譯點英文資料可以讓你靜下心來,我已試過,很有幫助;

還有一點,蘋果官方文檔實屬繁多,全部按部就班的翻譯會耗時很長。為提高此翻譯文章實質作用,特懇請大家能給一些指引,大家可以把日常工作用到的章節私信評論給我,我用業余時間把這些急需的章節翻譯出來,貢獻給大家,當然,翻譯的文章難免有不足的地方,還望各位好友指出,以提高文章質量。

視圖和窗口體系結構##

  • 視圖和窗口呈現應用的交互界面并且處理交互事件。UIKit和其他系統框架提供大量可以使用而很少改動或無需改動的視圖。你也可以在與標準視圖呈現內容不同的地方設置自定義視圖。

  • 無論你是使用系統視圖還是自定義視圖,都需要理解由UIVIewUIWindow類所提供的基礎結構。這些類提供復雜的設施來管理視圖的布局和顯示。理解這些設施是如何工作的對于確保在應用發生變化時視圖可以正常工作是非常重要的。

視圖結構的基本原理####

  • 表面上,你可能想去做的就是處理視圖對象(UIView的子類).一個視圖對象規定了視圖上矩形區域,并且在矩形區域上處理繪畫和觸摸事件。視圖也可以是其他一些視圖的父類,協調那些視圖的位置和尺寸。UIView的大部分工作用于管理視圖之間的關系,但也可根據自己的需要自定義視圖默認的行為。
  • 視圖與核心動畫層合力處理視圖內容修改和動畫顯示。在UIKit的每個視圖都是由一個圖層對象(通常都是 CALayer的子類)支持,這些圖層管理視圖的存儲回存以及處理視圖相關的動畫。大部分的操作都得通過UIView的接口。然而,在那些你需要的控制遠多于視圖渲染和動畫行為的情形下,你需要通過圖層來執行相應的操作。
  • 為理解視圖和圖層的關系,下面的例子會對你有所幫助。圖1-1展示了從視圖切換例子應用到底層核心動畫層的關系。應用中的視圖包括窗口(本身也是視圖),一個作為視圖容器的UIView對象,一個圖片視圖,一個展示控制的工具條,一個條按鈕項(它本身不是視圖,但他管理內部的視圖)。每個視圖都有一個響應圖層,并且可以通過視圖的 layer屬性訪問到其中,由于條按鈕項不是視圖,故不能直接訪問它的 layer屬性。在這些圖層對象的后面是核心動畫渲染對象和用于管理屏幕具體像素的硬件緩沖區。
    圖1-1例子應用視圖的體系結構
    圖1-1例子應用視圖的體系結構
  • 使用核心動畫圖層對象對于性能提升有重要的意義。盡可能少的調用視圖對象的繪制代碼,一旦代碼被調用,就會被核心動畫緩存下來,以便以后盡可能的復用。復用已渲染好的內容可以消除更新視圖所帶來的高消耗的繪制周期。在動畫過程中,復用已存在的內容是相當重要的。這種復用機制與創建新的內容相比,消耗的成本更低。

視圖層次和子視圖的管理####

  • 一個視圖在呈現自身內容之外,還可以作為其他視圖的容器。當一個視圖包含另一個視圖時,兩個視圖間的父子關系就創建出來了。在關系中,孩子視圖就是子視圖,父親視圖就是超視圖。這種關系的創建對于應用的虛擬外表和行為具有重要的意義。
  • 表面上,子視圖掩蓋全部或部分父視圖的內容。如果子視圖是完全不透明的,有子視圖組成的區域將會完全掩蓋父視圖相應地區域。如果子視圖部分透明,在屏幕顯示之前,父視圖和子視圖的內容就會混合在一起。每一個父視圖都將子視圖存儲在一個有序的數組中,這個順序影響著每個子視圖可視度。如果兩個兄弟視圖相互重疊,最后加入的視圖將會最先顯示。
  • 父子視圖的關系也影響著一些視圖行為。改變父視圖大小會產生波浪作用,導致子視圖的位置和尺寸也隨之變化。當父視圖的尺寸發生變化時,使用視圖的調整功能以恰當的配置視圖。另一些影響子視圖的變化有:隱藏父視圖、改變父視圖的透明度、將數學變化應用到父視圖的坐標系統中。
  • 在視圖層次中管理視圖決定著你的應用是如何響應事件的。當在特定視圖中發生觸摸事件時,系統將會把帶有觸摸信息的事件對象直接發送到視圖的處理機制中。然而,如果視圖沒有處理特定的觸摸事件時,它將會把事件對象傳送到父視圖。如果父視圖沒有處理事件,將會把事件對象傳遞到父視圖的父視圖,以此類推,直到響應鏈。特定的視圖也會將事件對象傳遞到介于中間的響應對象,例如視圖控制器。如果沒有對象處理該事件,最終達到拋棄它的應用對象。(寫于16.4.1)

視圖繪制周期####

  • 視圖類使用一種按需繪畫模式呈現內容。當視圖第一次出現在屏幕上,系統將會請求繪制其內容。系統捕獲內容的快照,并將此快照作為視圖的虛擬顯示。如果你從不想改變視圖內容,那么視圖的繪制代碼可能從不會再次調用。快照被復用在包括視圖在內的大部分操作。如果你改變了這個內容,你通知系統視圖已發生改變。視圖將會重復繪制視圖和捕獲快照的過程。
  • 當你視圖的內容改變時,你沒有直接重新繪制這些改變。相反,你可以使用setNeedsDisplay或者setNeedsDisplayInRect:方法使你的視圖失效。這些方法會告訴系統這些已改變內容的視圖需要在下次機會重新繪制。系統直到當前運行循環結束才進行任何繪制操作。

寫在最后

這篇文章翻譯很長時間,中間總是斷斷續續的,今天終于完成了,心里石頭也算是放下了。
通過翻譯文章,一方面讓自己重新學習了一下以前的知識,一方面,也鍛煉了自己的英語翻譯的能力。雖然翻譯水平很low吧,但我還是會堅持下去的,加油!

非常感謝您的閱讀,最近開通了微信公眾號,為您呈現更加精彩的技術文章,個人公眾號ID:iOSDevSkills,期待您的加入!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容