Swift(十四)UINavigationController

更新:2018.05.24

整理了一下demo:SwiftDemo


  • UINavigationController導(dǎo)航條控制器用于顯示多屏并具有一定層次結(jié)構(gòu)的內(nèi)容呜投,是構(gòu)建分層應(yīng)用的主要工具休弃。
  • 它維護(hù)了一個(gè)視圖控制器棧,所有的子視圖控制器都處于堆棧中健田。
  • UINavigationController導(dǎo)航條控制器在管理、切入和切出多個(gè)內(nèi)容頁方面淑仆,與UITabBarController類似漆诽。
  • UINavigaitonControllerUITabBarController區(qū)別在于:UINavigationController是作為棧來實(shí)現(xiàn)的,它更適合用于處理和顯示分層的數(shù)據(jù)扮休。

一迎卤、創(chuàng)建一個(gè)UINavigationController

  1. 首先我們還是新建一個(gè)項(xiàng)目,然后添加兩個(gè)新的視圖控制器:FirstViewControllerSecondViewController玷坠。
  2. 為了更好的演示蜗搔,我們分別設(shè)置一下兩個(gè)視圖控制器的屬性

FirstViewController.swift

import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "第一頁"
        view.backgroundColor = UIColor.gray
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "下一頁", style: .plain, target: self, action: #selector(nextPageClick))
    }
    
    func nextPageClick() {
        navigationController?.pushViewController(SecondViewController(), animated: true)
    }

}

SecondViewController

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "第二頁"
        view.backgroundColor = UIColor.cyan
    }
}

a.FirstViewController中,我們設(shè)置了title和背景顏色八堡,title是這個(gè)視圖控制器的標(biāo)題樟凄,如果有導(dǎo)航條的話,這個(gè)title會(huì)顯示在導(dǎo)航條的中心位置兄渺,如果沒有導(dǎo)航條的話缝龄,它就沒什么作用,

b. 接著,我們創(chuàng)建了一個(gè)導(dǎo)航條右側(cè)的按鈕,確切的說叔壤,是重建了一個(gè)UIBarButtonItem瞎饲,并替換了默認(rèn)的導(dǎo)航條右側(cè)按鈕。添加方法炼绘,點(diǎn)擊這個(gè)按鈕嗅战,調(diào)起nextPageClick ()方法。

c. 當(dāng)點(diǎn)擊rightBarButtonItem時(shí)俺亮,執(zhí)行nextPageClick()驮捍,然后當(dāng)前視圖控制器的導(dǎo)航控制器(navigationController)調(diào)起pushViewController()方法,目的是跳轉(zhuǎn)到下一個(gè)視圖控制器铅辞。pushViewController()有兩個(gè)參數(shù)厌漂,第一個(gè)參數(shù)表示需要加載的視圖控制器,第二個(gè)參數(shù)表示是否需要?jiǎng)赢嬓Ч迳骸.?dāng)然苇倡,這個(gè)方法只有在視圖控制器的導(dǎo)航控制器被實(shí)例化之后才有效。
d.SecondViewController.swift中囤踩,我們只設(shè)置了title和背景顏色旨椒,當(dāng)我們跳轉(zhuǎn)到這個(gè)視圖控制器,導(dǎo)航控制器會(huì)默認(rèn)生成一個(gè)leftBarButton返回按鈕堵漱。

  1. 接下來综慎,我們到AppDelegate.swift中,將FirstViewController設(shè)置為導(dǎo)航控制器的跟視圖控制器
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window?.rootViewController = UINavigationController(rootViewController: FirstViewController())
        return true
    }

二勤庐、UINavigationController視圖入棧和出棧

在上面我們創(chuàng)建了一個(gè)簡單的導(dǎo)航控制器示惊,這個(gè)導(dǎo)航控制器有一個(gè)根視圖控制器,當(dāng)點(diǎn)擊rightBarButtonItem時(shí)愉镰,SecondViewController會(huì)被push到導(dǎo)航控制器中米罚。

  • 這里的push就相當(dāng)于入棧操作。
  • 與之相反的pop操作丈探,相當(dāng)于出棧录择。
  • 根據(jù)堆棧的先進(jìn)先出規(guī)則,當(dāng)執(zhí)行pop操作時(shí)碗降,位于棧頂?shù)囊晥D控制器隘竭,將被從導(dǎo)航控制器的堆棧中移除。

這里就不實(shí)際舉例說明了讼渊,比較好理解动看。

導(dǎo)航欄的顯示和隱藏

我們可以在viewWillAppear()中設(shè)置視圖控制器的navigationControllernavigationBarHidden屬性來設(shè)置導(dǎo)航欄的隱藏和顯示。

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: false)
    }

a. navigationBarHidden ()方法有兩個(gè)參數(shù)爪幻,第一個(gè)參數(shù)表示是否隱藏導(dǎo)航欄弧圆,第二個(gè)屬性表示是否需要?jiǎng)赢嬓Ч?/p>

三赋兵、導(dǎo)航欄樣式

根據(jù)項(xiàng)目的需求,原始的導(dǎo)航欄很難滿足我們的需求搔预。

        
        // 添加導(dǎo)航條上方的提示霹期,這個(gè)屬性被設(shè)置后,導(dǎo)航欄的高度將增加到74
        navigationItem.prompt = "正在使用您的位置..."
        // 設(shè)置導(dǎo)航欄不透明
        navigationController?.navigationBar.isTranslucent = false
        // 設(shè)置導(dǎo)航條樣式
        navigationController?.navigationBar.barStyle = UIBarStyle.black
        // 設(shè)置導(dǎo)航欄關(guān)鍵元素顏色拯田,tintColor屬性是View專門用來指定所包含的關(guān)鍵元素的顏色
        navigationController?.navigationBar.tintColor = UIColor.white
        // 設(shè)置導(dǎo)航欄背景圖片
        navigationController?.navigationBar.setBackgroundImage(UIImage(named:""), for: .any, barMetrics: .default)
        
        // 設(shè)置導(dǎo)航欄 title 的 Font
        navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName:UIFont.boldSystemFont(ofSize: 18)]
        // 設(shè)置導(dǎo)航欄 title 的 Color
        navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
        
        // 設(shè)置導(dǎo)航欄陰影部分圖片历造,也就是導(dǎo)航欄下面那條細(xì)線
        navigationController?.navigationBar.shadowImage = UIImage(named:"")
        // 設(shè)置導(dǎo)航欄陰影顏色
        navigationController?.navigationBar.layer.shadowColor = UIColor.green.cgColor
        // 設(shè)置導(dǎo)航欄陰影偏移
        navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 10)
        // 設(shè)置導(dǎo)航欄陰影透明度
        navigationController?.navigationBar.layer.shadowOpacity = 0.2

  • 設(shè)置prompt屬性之后,導(dǎo)航欄的高度會(huì)增加到74船庇,并在導(dǎo)航欄的上方顯示內(nèi)容吭产。
  • translucent屬性默認(rèn)是 true ,當(dāng)設(shè)置了該屬性后,導(dǎo)航欄變成不透明鸭轮,同時(shí)臣淤,視圖控制器的view的高度也將發(fā)生變化。
  • 導(dǎo)航欄也可以設(shè)置背景圖片窃爷,通過setBackgroundImage()方法邑蒋,該方法有三個(gè)參數(shù),第一個(gè)參數(shù)代表圖片按厘,第二個(gè)參數(shù)和第三個(gè)參數(shù)都是枚舉医吊,第二個(gè)參數(shù)表示導(dǎo)航欄的位置,第三個(gè)參數(shù)表示導(dǎo)航欄的外觀逮京。具體可以自己試一下卿堂。
  • titleTextAttributes屬性是一個(gè)字典,一般我們用于設(shè)置導(dǎo)航欄標(biāo)題的文本大小和字體懒棉。
  • 導(dǎo)航欄的陰影部分是可以設(shè)置的草描,包括更改陰影部分的顏色、背景策严、大小等穗慕。

四、導(dǎo)航控制器和標(biāo)簽控制器

在iOS開發(fā)過程中享钞,經(jīng)常會(huì)將navigationCongtrollertabBarController相結(jié)合使用揍诽,我們可以回到Swift(十三)UITabBarController的仿微信的例子诀蓉,來看一下栗竖。
直接在AppDelegate.swift文件中修改即可。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let wechat = WeChatViewController()
        // 未選中狀態(tài)Tab圖片
        wechat.tabBarItem.image = UIImage(named: "tab1")?.withRenderingMode(.alwaysOriginal)
        // 選中狀態(tài)Tab圖片
        wechat.tabBarItem.selectedImage = UIImage(named: "selectTab1")?.withRenderingMode(.alwaysOriginal)

        
        let addressBook = AddressBookViewController()
        addressBook.tabBarItem.image = UIImage(named: "tab2")?.withRenderingMode(.alwaysOriginal)
        addressBook.tabBarItem.selectedImage = UIImage(named: "selectTab2")?.withRenderingMode(.alwaysOriginal)
        
        
        let find = FindViewController()
        find.tabBarItem.image = UIImage(named: "tab3")?.withRenderingMode(.alwaysOriginal)
        find.tabBarItem.selectedImage = UIImage(named: "selectTab3")?.withRenderingMode(.alwaysOriginal)
        
        
        let mine = MineViewController()
        mine.tabBarItem.image = UIImage(named: "tab4")?.withRenderingMode(.alwaysOriginal)
        mine.tabBarItem.selectedImage = UIImage(named: "selectTab4")?.withRenderingMode(.alwaysOriginal)
        
        
        let tabBarController = UITabBarController()
        tabBarController.tabBar.tintColor = UIColor.init(colorLiteralRed: 9/255.0, green: 187/255.0, blue: 7/255.0, alpha: 1)
        
        
        wechat.title = "微信"
        let wechatNavigationController = UINavigationController(rootViewController: wechat)
        addressBook.title = "通訊錄"
        let addressBookNavigationController = UINavigationController(rootViewController: addressBook)
        find.title = "發(fā)現(xiàn)"
        let findNavigaitonController = UINavigationController(rootViewController: find)
        mine.title = "我的"
        let mineNavigationController = UINavigationController(rootViewController: mine)
        
        tabBarController.viewControllers = [wechatNavigationController,addressBookNavigationController,findNavigaitonController,mineNavigationController]
        
        window?.rootViewController = tabBarController
        return true
    }

a. 我們可以看到渠啤,現(xiàn)在TabBar的viewControllers里面添加的都是UINavigationController了狐肢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沥曹,隨后出現(xiàn)的幾起案子份名,更是在濱河造成了極大的恐慌碟联,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僵腺,死亡現(xiàn)場離奇詭異鲤孵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辰如,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門普监,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琉兜,你說我怎么就攤上這事凯正。” “怎么了豌蟋?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵廊散,是天一觀的道長。 經(jīng)常有香客問我梧疲,道長允睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任往声,我火速辦了婚禮擂找,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浩销。我一直安慰自己贯涎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布慢洋。 她就那樣靜靜地躺著塘雳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪普筹。 梳的紋絲不亂的頭發(fā)上败明,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音太防,去河邊找鬼妻顶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜒车,可吹牛的內(nèi)容都是我干的讳嘱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼酿愧,長吁一口氣:“原來是場噩夢啊……” “哼沥潭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嬉挡,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钝鸽,失蹤者是張志新(化名)和其女友劉穎汇恤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔恰,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡因谎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颜懊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝角。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭冬,靈堂內(nèi)的尸體忽然破棺而出使鹅,到底是詐尸還是另有隱情,我是刑警寧澤昌抠,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布患朱,位于F島的核電站,受9級(jí)特大地震影響炊苫,放射性物質(zhì)發(fā)生泄漏裁厅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一侨艾、第九天 我趴在偏房一處隱蔽的房頂上張望执虹。 院中可真熱鬧,春花似錦唠梨、人聲如沸袋励。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茬故。三九已至,卻和暖如春蚁鳖,著一層夾襖步出監(jiān)牢的瞬間磺芭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工醉箕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钾腺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓讥裤,卻偏偏與公主長得像放棒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坞琴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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