iOS學習筆記之View

View簡介

一個view可以從nib生成,也可以在代碼中創建。View hierarchy 是主要的view組織形式。一個view可以有多個subviews,但是一個 subview只能有一個直接的superview。所以很多view就會組成一棵樹。如果一個view被移出view hierarchy,它的子類也會被移除;如果一個view被隱藏,它的子類也會被隱藏;如果一個view移動,它的子類也會被移動。

The Window

View hierarchy的頂層是應用的window,是UIWindow(UIView 的子類) 的一個實例。你的應用應該只有一個main window。它將在應用啟動時被創建并且不會被銷毀或者代替。它是應用的背景并且是終極superview,也就是所有其他的view都是它的subviews。

假如你的應用要顯示在外接屏幕上,就需要創建額外的UIWindow

應用的window必須填充設備的screen,具體的做法是在window初始化時把window的frame設置成screen的bounds。使用main storyboard的話這個事情會由UIApplicationMain函數在應用啟動的時候自動完成。如果不用main storyboard的話就需要自己在應用的聲明周期中創建window并且設置好frame.

這個window必須在應用而生命周期中一直保持著。為了做到這樣,app delegate類會用一個strong retain policy來持有一個 window屬性。具體的過程是:在應用啟動時,UIApplicationMain 方法會初始化app delegate類并且一直持有它,然后window實例就會被賦值到app delegate的 window屬性上,所以也會被一直持有。

通常來說,你會得到一個view controller并且會被賦值到main window的rootViewController屬性上。如果你用的是main storyboard,這都都會自動初始化好。當一個view controller 成為main window的rootViewController,它的view就成為了 main window有且僅有的一個直接subview,也就是main window 的root view。之后所有的view 都只能是這個root view的 subview。也就是說root view是view hierarchy中用戶通常能看到的地位最高的對象。

但是有些時候用戶可能會看到root view之后的window,所以最好給這個window設置合適的backgroundColor。但通常來說我們沒有理由去對window本身做任何修改。應用的界面在對應的window被設置為key window之前都是不可見的。這個可以通過調用UIWindow實例的makeKeyAndVisible方法來完成。

main window從創建、配置到顯示的過程:

  • 使用main storyboard
  • storyboard文件在Info.plist的鍵為Main storyboard file base name中指定(UIMainStoryboardFile)
  • UIapplicationMain實例化UIWindow并設置好frame
    把設置好的UIWindow的實例指定給app delegate的window屬性
  • 實例化view controller并指定給window的 rootViewController屬性

View Hierarchy的特點

  • 如果一個view被移出或者引入它的superview,它的subview會跟著被移出或引入;
  • 一個view的透明度會被其subview繼承;
  • 一個view可以限制subview的顯示范圍,比如不讓subview超出 view本身的范圍,這叫做clipping,被設置在clipsToBounds 屬性中;
  • 一個superview擁有它的subview;
  • 如果一個view的尺寸變化了,它的subview也會自動被重新設置尺寸。

一個UIView有一個superview屬性和一個subviews屬性(一個 UIView對象的數組,back-to-front順序)。另外也有一個 isDescendantOfView: 方法來檢查一個view是不是另一個view 的subview。View還有一個tag屬性,可以通過viewWithTag: 來進行引用。

在代碼中操作view hierarchy很簡單。addSubview: 方法添加一個subview,removeFromSuperview移除一個subview。

當addSubview:被調用時,這個view會被放到其superview的 subview數組中的最后一個,也就是說會被最后畫出來,即出現在最前面。一個view的subviews是被索引的,從0開始(rearmost)。可以把一個view插入到指定位置,以及放到前面/后面,或交互兩個view。

  • insertSubview:atIndex:
  • insertSubview:belowSubview:,
  • insertSubview:aboveSubview:
  • exchangeSubviewAtIndex:withSubviewAtIndex:
  • bringSubviewToFront:, sendSubviewToBack:

奇怪的是,沒有一個方法可以直接移除一個view的所有subview。然而,因為一個view的subview數組是一個不可變的數組,所以可以用如下方法一次移除全部:

myView.subviews.forEach{$0.removeFromSuperview}

Visibility and Opacity

視圖的可見性可以通過設置hidden屬性來更改。一個隱藏的view無法接收觸摸事件,所以對于用戶來說相當于不存在,但實際上是存在的,所以仍然可以在代碼中對其操作。

View的背景顏色可以通過其backgroundColor屬性來設置,顏色屬于UIColor類。如果backgroundColor為nil那么背景就是透明的??梢酝ㄟ^設置view的alpha屬性來修改透明程度,1.0是完全不透明,0.0是透明。假設一個view的alpha是0.5,那么它的subview 的alpha都是以0.5為基準的,不可能高于0.5。而 UIColor也有 alpha這個屬性,所以即使一個view的alpha是 1.0,它仍舊可能是透明的,因為其 backgroundColor可以是透明的。一個alpha為 0.0 的 view是完全透明的所以是不可見的,通常來說也不可能被點擊。

View的alpha屬性不僅影響背景顏色,也會影響其內容的透明度。
View的opaque屬性的修改并不會影響view的樣子,更多的是對于系統繪制時的提示。如果一個view的opaque設為true,因為不用考慮透明的繪制,所以效率會高一點,并且再設置透明的背景顏色或者 alpha屬性都無效??赡軙屓顺泽@,它的默認值是true。

Frame

View的frame屬性(CGRect 類)是它本身的長方形在superview 中的位置,注意是在superview的坐標系中的位置。默認來說,superview的坐標系原點在左上,向右x增加,向下y增加。

Bounds&Center

當創建一個UIView時,其bounds的坐標原點是(0.0, 0.0),也就是左上角,如果改變了bounds的原點,也就改變了其坐標系,其 subview一般也會有變化,下面代碼描述了這種情況

Trait Collections and Size Classes

界面上的每個view都有一個traitCollection屬性,值是一個 UITraitCollection,包含下面四個屬性:

  • displayScale,由當前屏幕決定的縮放尺寸,1(single resolution) 2(double resolution) 3(iPhone 6/6s Plus)
  • userInterfaceIdiom,一個UserIterfaceIdiom值,可能是 .Phone 或 .Pad,來標志不同的設備,默認來說和UIDevice 的userInterfaceIdiom屬性一致
  • horizontalSizeClass, verticalSizeClass,是 UIUserInterfaceSizeClass值,可能是.Regular 或.Compact
  • 水平和豎直都是.Regular -> iPad
  • 水平是.Compact,豎直是.Regular->iPhone在垂直方向,或者 iPad 的分屏應用
  • 水平和豎直都是 .Compact -> iPhone 在水平方向(iPhone 6/6s plus除外)
  • 水平是 .Regular 豎直是 .Compact -> iPhone 6/6s Plus 在水平方向
    當應用運行時如果 trait collection 發生改變,會調用 traitCollectionDidChange 方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容