二:StoryBoard Reference搭建界面的效果如圖swift
:數組
三:StoryBoard Reference具體使用:閉包
1:先設置啓動Main StoryBoardapp
:ide
2:再打開Main StoryBoard,刪除其控制器,拖入一個UItabBarViewController,刪掉其自帶的兩個item,在左側直接選中刪除:並函數
設置啓動控制器:spa
3:1:在拖入五個導航控制器,導航控制器自帶根控制器,且根控制器默認爲UITableViewController,能夠刪除UITableViewController裏顯示的cell,cell由本身來建立。再拖線設置UItabBarViewController的根控制器爲每一個導航控制器(選中拖入UItabBarViewController並右擊,選擇ViewController拖向每個拖入的 導航控制器,這樣就設置了UItabBarViewController的根控制器) 2:設置tabBarItem標題圖片 與導航欄標題:在如圖處選中導航控制器,來到右側,可設置導航欄標題,選中與未選中圖片3d
4: 設置StoryBoard Reference如圖2:1:先選中導航控制器和其根視圖控制器 2:eidtor -- 選中圖中最後一個 3:關聯類:如圖1,code
將相應的storyBoard關聯類,如圖所示orm
三:在控制器中設置tabbarItem的選中圖片與增減中間按鈕(設置選中圖片能夠在storyBoard中去設置)
import UIKit /* 總結:1:lazy用於懶加載,只能用var來對變量進行懶加載,有兩種方式:1:lazy var first = NSArray(objects: "1","2") 2:閉包形式: lazy var second:String = { return "second" }() 例子: lazy var imageArr = ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"] lazy var imageArr = { return ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"] }(); 2:1:設置tabbaritem的代碼都必須放在viewWillAppear裏,如果在viewDidLoad裏,則設置好的item又會在viewWillAppear方法裏被系統調整回來 2:for循環遍歷,1:要是想得到下標值就用區間遍歷 for i in 0..<tabBar.items!.count {}(tabBar.items是一個可選類型,能保證其必定有值,因此能夠進行!強制解包,根據i值能夠從懶加載的數組中取出對應元素)2:如果不想得到下標值,只想得到懶加載數組中的元素值,能夠直接遍歷,for item in tabBar.items!{} 2:swift中的布爾值用Bool來表示,有true 和 false兩種,設置按鈕不可點擊,btn.isEnabled = false,與for循環經常使用的有continue,跳過本次循環,不執行下面的代碼,當即執行下一個循環,break當即終止循環,return,也是當即返回,不執行return下面的代碼。 3:要想類中定義的屬性不但願外界來訪問,就定義爲private,或是fileprivate,private修飾的屬性方法,只能在當前類中訪問,在同一個文件中定義不一樣的類就不能在訪問另外一個類中private修飾的方法或是屬性,可是屬性或是方法用fileprivate能夠在當前文件任何類中進行訪問 */ class RHTabBarViewController: UITabBarController { // lazy var imageArr = ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"] ///1:懶加載圖片數組 fileprivate lazy var imageArr = { return ["tabbar_home_highlighted","tabbar_message_center_highlighted","","tabbar_discover_highlighted","tabbar_profile_highlighted"] }(); ///2:懶加載中間按鈕 fileprivate lazy var centerButton = UIButton() override func viewDidLoad() { super.viewDidLoad() //MARK:-2:添加中間按鈕 setupCenterButton() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //MARK:-1:設置tabbarItem的高亮圖片 setupTabbarItems() } } /** 總結:1:extension表示擴展,在定義的類中:RHTabBarViewController,設置該類的擴展,extension RHTabBarViewController {},如果該類有遵照協議關係的時候,繼承的協議就在RHTabBarViewController後面加:後面寫遵照的協議 2:通常extension擴展用於在某個類中封裝方法,在viewDidLoad方法中抽方法封裝調用,將封裝的方法寫在extension的擴展類中,在viewDidLoad直接調用 2:通常在聲明的類class中定義屬性:1:private,或是filePrivate來修飾,而且通常採用懶加載(1:直接初始化 2:閉包懶加載,{return:一個值}()),若不是懶加載,定義屬性變量的時候,必須定義初始化有值,要不定義成可選類型,在後面進行賦值,不然會被報錯。 2:在viewDidload中抽方法封裝調用,將封裝的方法寫在extension的擴展類中,在定義方法的時候,也是private,fileprivate來選擇修飾,定義有返回值或是無返回值的函數。2:定義的函數中涉及到外部參數與內部參數:在swift中第一個參數默認爲內部參數,_+空格+參數名組成,默認從第二個參數開始,既是外部參數又是內部參數,如果想讓某個參數成爲內部參數,就直接在函數中用_+空格+參數名修飾就能夠 3:函數的默認參數,在封裝的函數中,也能夠給參數設定默認參數,則此時,外部調用就不會顯示默認參數,而在參數內部本身能夠拿到默認參數的值:如定義的全局打印:fileName:String = #file func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) { #if DEBUG let file = (fileName as NSString).lastPathComponent; print("\(file):\(funcName):\(lineNum):\("打印內容"):\(message)") #endif } 3:設置tabbar上的高亮圖片:1:tabBar.items爲一個可選類型的數組,可是能保證其必定有值,因此能夠進行強制解包,如果可選類型的變量能肯定必定有值的話就對其進行強制解包 2:建立UIImage的對象:item.selectedImage = UIImage(named: imageArr[i]) 4:添加中間的加號按鈕:1:懶加載完控件後,首先在方法中將控件添加到父控件中,在同一個類中屬於該類的方法能夠不去調用self,tabBar.addSubview(centerButton) 2:設置按鈕的背景圖片centerButton.setBackgroundImage, centerButton.setImage,第二個參數爲一個枚舉值,枚舉值調用就用點語法調用枚舉類型,.normal,.highlighted 3:設置按鈕的frame:centerButton.sizeToFit() 讓按鈕的大小等於按鈕內容的大小。設置center的時候,設置的是tabbar的centerx,中心點y值爲tabba高度的一半 */ extension RHTabBarViewController { ///1:添加中間的加號按鈕 fileprivate func setupCenterButton() { //1:添加按鈕 tabBar.addSubview(centerButton) //2:設置圖片 centerButton.setBackgroundImage(UIImage(named: "tabbar_compose_button"), for: .normal) centerButton.setBackgroundImage(UIImage(named:"tabbar_compose_button_highlighted"), for: .highlighted) centerButton.setImage(UIImage(named:"tabbar_compose_icon_add"), for: .normal) centerButton.setImage(UIImage(named:"tabbar_compose_icon_add_highlighted"), for: .highlighted) //3:設置frame centerButton.sizeToFit() centerButton.center = CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5) } ///2:設置的是tabbar上的高亮圖片 fileprivate func setupTabbarItems() { for i in 0..<tabBar.items!.count { let item = tabBar.items![i] if i == 2 { item.isEnabled = false continue } item.selectedImage = UIImage(named: imageArr[i]) } } }