本節書摘來自華章計算機《swift ios應用開發實戰》一書中的第2章,第2.4節,作者:劉銘 著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在前面幾節的學習中我們已經為calculator項目建立了使用者界面,其中使用了視圖、label和button控件,接下來我們将詳細了解有關視圖和視窗的概念。
2.4.1 視圖概述
視圖屬于可視化對象,多個視圖組合起來就組成了ios應用程式的使用者界面。視圖本質上反映的是螢幕上的一塊特定的矩形區域内所發生的事情,例如,根據使用者的互動進行可視化方面的更新。所有視圖都是uikit架構中的uiview類的子類,例如uilabel、uiimageview、uibutton和uitextfield都是它的子類。
另外一個比較特别也比較重要的uiview子類就是uiwindow。
2.4.2 uiwindow類
如果你之前開發過windows或os x平台的桌面應用程式,肯定會非常熟悉視窗的概念。一個典型的桌面應用程式會有多個視窗,每個視窗都會有标題欄,并且在标題欄中還會有一些控制按鈕,負責視窗的關閉、最大化與最小化。這裡的視窗,簡單來說隻是提供了在螢幕上的一個“面”,應用程式在這個“面”上向使用者呈現資訊和互動的控件。
基于ios的uiwindow類也提供了相同的功能:為視圖元件的顯示提供“面”。但是與桌面應用程式之間的不同在于ios應用程式通常隻能有一個視窗,并且這個視窗必須充滿整個螢幕,也沒有我們在桌面應用程式中所熟悉的标題欄。
uiwindow也是uiview的子類,而且它位于整個應用程式視圖層次的最頂端。使用者根本無法看到也不能直接與uiwindow對象進行互動,甚至它本身在一般情況下都是由ib自動建立的。
2.4.3 視圖的層次
建構ios 8應用程式的使用者界面使用了分層的方式,不同的視圖通過父/子關系互相聯系。位于這個層次中最頂端的視圖是uiwindow對象,然後添加其他類型的視圖對象。在本章之前我們設計的使用者界面包括1個視窗、1個視圖、1個标簽和17個按鈕。使用者界面的視圖層次可以用圖2-14來表示。

從圖2-14中我們可以發現,uiwindow對象是uiview對象的父視圖,而uiview則是uiwindow的子視圖。同理,uilabel和uibutton則是uiview的子視圖。子視圖隻有一個直接父視圖,而一個視圖則可以有多個子視圖。
另外,視圖層次結構可以嵌套更多層級的視圖結構,比如我們可以設計下面的層次結構,如圖2-15所示。但是為了簡化界面,calculator項目并沒有使用這樣的層次結構。
視圖的層次結構可以有效地幫助開發者組織和管理複雜的使用者界面。很明顯,子視圖總是出現在其父視圖的上面。可以想象,當calculator運作的時候,uilabel總是出現在uiview的上面。不僅如此,當父視圖大小發生變化的時候(視圖大小改變通常是在螢幕發生旋轉的時候),依據視圖之間的互相關系子視圖的大小和位置也會發生變化。
在calculator項目中uiwindow對象對使用者來說是不可見的,因為它總是會被其上的uiview對象全部覆寫掉,然後在這個uiview上面顯示uilabel和uibutton。
視圖的層次同時也定義了互動事件的處理方式,稱做 “響應鍊”。例如,一個子視圖收到一個不能處理的事件,那麼這個事件就會被傳遞到它的即時父視圖對象。如果父視圖也不能處理該事件,則繼續傳遞給它的父視圖。就這樣層層傳遞,直到某個視圖對象可以處理這個事件為止。
2.4.4視圖的類型
uikit架構包含了各種視圖對象,可以分為以下幾類。
(1)視窗
視窗(the window)特指前面所介紹的uiwindow類,它是整個視圖層次中的根視圖(root view),并且為所有需要繪制的子視圖提供一個“面”。
(2)容器視圖
與普通的視圖對象相比,容器視圖(container view)增加了一些功能,比如,uiscrollview類就提供了滾動條和滾動功能。
(3)控件
控件類(controls)所包含的視圖既可以呈現資訊又可以響應使用者的互動。控件類都繼承自uicontrol類(uicontrol繼承自uiview),如按鈕、滑動塊、開關等。
(4)顯示視圖
顯示視圖(display views)與控件差不多,但它隻能呈現回報的可視化資訊,并不能響應使用者的互動,比如uilabel和uiimageview類。
(5) 文本和網頁視圖
uitextview和uiwebview這兩個類都能夠顯示特定格式的資訊給使用者,比如uiwebview可以顯示html格式的内容。
(6)導航視圖和标簽欄
導航視圖(navigation views)和标簽欄(tab bars)提供了讓使用者在程式中進行視圖導航的機制,比如電話程式和郵件程式。
(7)警告視圖
警告視圖(alert views and action sheets)的設計目的是當有緊急或重要資訊的時候提醒使用者注意,它們還提供了可選的按鈕讓使用者決定如何進行後面的操作。uialertview會在螢幕中央的位置顯示一個消息框,uiactionsheet則會從螢幕的下方滑入。