[iOS UI] 顯示

概述

在所有擁有UI的系統(tǒng)開發(fā)工作中沈条,一般開發(fā)人員最先認(rèn)識(shí)的都是UI系統(tǒng)酣难,這也是在自然界人們認(rèn)知事物的習(xí)慣-從表及里的認(rèn)知過(guò)程。

從我個(gè)人的經(jīng)驗(yàn)出發(fā)紊撕,包括iOS罢荡,Android,Qt等完成一個(gè)App UI開發(fā)对扶,總結(jié)來(lái)都可以從下圖3個(gè)部分來(lái)完成区赵,那么要系統(tǒng)地掌握一個(gè)系統(tǒng)UI開發(fā)過(guò)程和其中的問(wèn)題,都可以從這3個(gè)方面來(lái)認(rèn)知和展開浪南。

程序UI完成步驟

這篇文章笼才,主要探討一下第一部分- view顯示

問(wèn)題和結(jié)論

view顯示

如圖 view顯示,關(guān)于這個(gè)主題我們需要搞清楚兩件事情(并給出結(jié)論):

  1. iOS界面顯示到底是什么在顯示络凿?

UIView的層級(jí)結(jié)構(gòu)顯示

  1. 具體是通過(guò)什么方式顯示
  • 通過(guò)UIViewController進(jìn)行UIView管理并顯示
  • 通過(guò)代碼
  • nib file
  • storyboard
  • 直接對(duì)UIWindow進(jìn)行addSubView的操作(實(shí)際開發(fā)中不這么做)

解析

問(wèn)題1

我們首先看看顯示一個(gè)簡(jiǎn)單的“hello view”需要做哪些工作骡送。在Xcode中創(chuàng)建一個(gè)Single View Application昂羡,打開Main.storyboard,在右下角的Object Library中拖一個(gè)Label到Main.storyboard的畫布中(靠近左上角放置)各谚,修改Label的文字“hello view”紧憾,運(yùn)行,就會(huì)看到我們想要的界面昌渤。
程序在模擬器中運(yùn)行起來(lái)之后赴穗,在Xcode中選擇Debug View Hierarchy,回看到如下圖的app view 3d渲染: 我們可以看到實(shí)際上組成界面的是UIWindow->UIView->UILabel

view hierarchy.png

因?yàn)閕OS是通過(guò)UIScreen類拿到硬件屏幕顯示,所以事實(shí)上膀息,UIWindow是添加到UIScreen上以最終顯示般眉,所以完整的結(jié)構(gòu)是下圖所示(撒懶網(wǎng)上找得圖哈)

網(wǎng)圖

問(wèn)題2

window.addSubView

驗(yàn)證問(wèn)題1所展示的例子,是使用storyboard完成的潜支,在代碼層具體做了些什么甸赃,Interface Builder替我們完成了。這一節(jié)我們來(lái)探究代碼實(shí)現(xiàn)冗酿。
新建一個(gè)Single View Application埠对,打開AppDelegate.swift(OC相應(yīng)代碼很容易參照完成),修改第一個(gè)方法如下代碼示例1:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        var text = UILabel(frame: CGRectMake(20, 20, 100, 50))
        text.backgroundColor = UIColor.greenColor()
        text.text = "Hello World"
        window?.addSubview(text)
        window?.makeKeyAndVisible()
        
        return true
    }

運(yùn)行裁替,結(jié)果如下圖:


addSubView.png

可以看到项玛,同樣達(dá)到了顯示一個(gè)UILabel到屏幕上的結(jié)果,我們可以刪除Main.storyboard以證明是我們的代碼得到了這樣的結(jié)果(當(dāng)然這不是必要的)弱判。
查看注釋非常容易理解上面程序做得事:

創(chuàng)建一個(gè)UIWindow占滿整個(gè)UIScreen襟沮,然后創(chuàng)建了一個(gè)UILabel,把它加到UIWindow昌腰,最后把UIWindow設(shè)置為主Window并顯示开伏。

通過(guò)ViewController

通過(guò)代碼

雖然這樣能把UIView顯示在屏幕上,并且也可以構(gòu)建復(fù)雜的View hierarchy遭商,但是這是Apple不推薦的固灵,整個(gè)iOS開發(fā)推薦的管理界面的方法是使用ViewController。
咱們對(duì)上面的代碼進(jìn)行修改劫流,把整個(gè)方法修改為如下代碼示例2:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        var text = UILabel(frame: CGRectMake(20, 20, 100, 50))
        text.backgroundColor = UIColor.greenColor()
        text.text = "Hello World"
        var vc = UIViewController()
        vc.view.addSubview(text)
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
        
        return true
    }

運(yùn)行程序怎虫,得到和addSubView.png一樣的效果

主要的改動(dòng)就是引入了UIViewController并把ViewController設(shè)置為window.rootViewController,而本來(lái)直接加入window子view的UILabel困介,被UIViewController的View管理起來(lái)

在現(xiàn)實(shí)開發(fā)中大审,ViewController要控制View顯示的方方面面,加載座哩,修改徒扶,布局等等,所以根穷,代碼示例2在這里創(chuàng)建UIViewController并進(jìn)行View的組裝僅僅是為了易于理解姜骡,真正的開發(fā)中导坟,代碼實(shí)現(xiàn)界面顯示會(huì)是如下的做法:
下圖是Xcode Single View Application默認(rèn)的工程結(jié)構(gòu),


default project structure.png

打開ViewController.swift圈澈,覆蓋loadView()方法惫周,修改完的代碼示例如下:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func loadView() {
        
        let v = UIView()
        self.view = v
        
        let label = UILabel(frame: CGRectMake(20, 20, 100, 50))
        label.backgroundColor = UIColor.greenColor()
        label.text = "hello world"
        v.addSubview(label)
    }
}

然后我們得修改AppDelegate的第一個(gè)方法如下代碼示例:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
        
        return true
    }

運(yùn)行程序,還是會(huì)得到addSubView.png一樣的效果

除了代碼創(chuàng)建UI外康栈,iOS還提供了兩種方式來(lái)所見(jiàn)即所得地創(chuàng)建UI递递,storyboard和nib file,兩者其實(shí)都是本地化存儲(chǔ)的iOS對(duì)象啥么,在運(yùn)行時(shí)加載組裝和代碼一起完成UI的構(gòu)建和顯示登舞,現(xiàn)在storyboard是Xcode默認(rèn)方式,我們從它看起悬荣。

storyboard

新建一個(gè)Single View Application菠秒,給storyboard中加入一個(gè)UILabel “hello world",然后修改AppDelegate.swift第一個(gè)方法如下代碼示例:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        var mainSb = UIStoryboard(name: "Main", bundle: nil)
        window?.rootViewController = mainSb.instantiateInitialViewController() as? UIViewController
        window?.makeKeyAndVisible()
        
        return true
    }

運(yùn)行工程氯迂,會(huì)得到跟沒(méi)有修改AppDelegate.swift之前一樣的結(jié)果践叠。其實(shí),這就是默認(rèn)Single View Application隱性為我們做得事:

加載storyboard,從storyboard中加載initial View Controller嚼蚀,并把initial View Controller設(shè)置為window的rootViewController

nib file

新建一個(gè)Single View Application酵熙,新建一個(gè)User Interface -> View, 命名MainNib,創(chuàng)建完成會(huì)生成一個(gè)MainNib.xib驰坊。選中MainNib.xib,點(diǎn)擊View上面的File’s Owner哮独,然后在右側(cè)Identity Inspector中Custom Class的Class框里填上工程生成的ViewController拳芙。再選擇最右邊的Connection Inspector,將Outlets下面的View拖向畫布(也就是UIView)皮璧,將ViewController的View和MainNib.xib中的View進(jìn)行連接舟扎。拖一個(gè)“Hello World” UILabel到畫布中。


add file's owner.png

connect outlets.png

然后修改AppDelegate.swift的第一個(gè)方法為如下代碼:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window?.rootViewController = ViewController(nibName: "MainNib", bundle: nil)
        window?.makeKeyAndVisible()
        
        return true
    }

運(yùn)行程序悴务,會(huì)看到和用storyboard相同的結(jié)果睹限。


至此,UI顯示入門就告一段落讯檐。當(dāng)然這里并沒(méi)有深入涉及UIView的相關(guān)內(nèi)容羡疗,這在以后的博客中會(huì)有所涉及。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末别洪,一起剝皮案震驚了整個(gè)濱河市叨恨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挖垛,老刑警劉巖痒钝,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉颗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡送矩,警方通過(guò)查閱死者的電腦和手機(jī)蚕甥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栋荸,“玉大人菇怀,你說(shuō)我怎么就攤上這事≌羝洌” “怎么了敏释?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摸袁。 經(jīng)常有香客問(wèn)我钥顽,道長(zhǎng),這世上最難降的妖魔是什么靠汁? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蜂大,我火速辦了婚禮,結(jié)果婚禮上蝶怔,老公的妹妹穿的比我還像新娘奶浦。我一直安慰自己,他們只是感情好踢星,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布澳叉。 她就那樣靜靜地躺著,像睡著了一般沐悦。 火紅的嫁衣襯著肌膚如雪成洗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天藏否,我揣著相機(jī)與錄音瓶殃,去河邊找鬼。 笑死副签,一個(gè)胖子當(dāng)著我的面吹牛遥椿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淆储,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼冠场,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了本砰?” 一聲冷哼從身側(cè)響起慈鸠,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后青团,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體譬巫,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡本辐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年纤怒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛砰。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娃肿,死狀恐怖咕缎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情料扰,我是刑警寧澤凭豪,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站晒杈,受9級(jí)特大地震影響嫂伞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拯钻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一帖努、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粪般,春花似錦拼余、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至小作,卻和暖如春亭姥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躲惰。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留变抽,地道東北人础拨。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绍载,于是被迫代替她去往敵國(guó)和親诡宗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)击儡、插件塔沃、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評(píng)論 4 62
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,365評(píng)論 7 249
  • 7、不使用IB是鸽疾,下面這樣做有什么問(wèn)題吊洼? 6、請(qǐng)說(shuō)說(shuō)Layer和View的關(guān)系制肮,以及你是如何使用它們的冒窍。 1.首先...
    AlanGe閱讀 673評(píng)論 0 1
  • 今天做了 1.打通審核環(huán)節(jié) 2.打通線上線下對(duì)接環(huán)節(jié) 3.定用戶協(xié)議和商戶合同初稿。 4.精選項(xiàng)目的添加和篩選 5...
    poligy閱讀 148評(píng)論 0 0
  • 1豺鼻、首頁(yè)顯示文章摘要在index.php文件找到代碼<?php $this->content('閱讀剩余部分......
    0ne0ne閱讀 1,487評(píng)論 0 0