1. 程式人生 > >Swift之自定義突出按鈕Tabbar

Swift之自定義突出按鈕Tabbar

個人原創請勿轉載!謝謝

也不算是自定義一個Tabbar,而是在UITabbar的基礎上使用Runtime來進行動態新增屬性

效果如圖:

Tabbar效果展示,來自最近的我的專案

執行時機制

Runtime是一套比較底層的純C語言的API, 屬於C語言庫, 包含了很多底層的C語言API。
在我們平時編寫的iOS程式碼中, 最終都是轉成了runtime的C語言程式碼。所謂執行時,也就是在編譯時是不存在的,只是在執行過程中才去確定物件的型別、方法等。利用Runtime機制可以在程式執行時動態修改類、物件中的所有屬性、方法等。

即使一行 Objective-C 程式碼也不寫,每一個 Swift app 都會在 Objective-C runtime 中執行,開啟動態任務分發和執行時物件關聯的世界。更確切地說,可能在僅使用 Swift 庫的時候只執行 Swift runtime。但 Objective-C runtime 與我們共處瞭如此長的時間,我們也應該將其發揮到極致。

涉及方法

關聯物件(Associated Objects)
Swift extension 能對已經存在 Cocoa 類中新增極為豐富的功能,但它的兄弟 Objective-C 的 category 卻遜色了不少。比如說 Objective-C 中的 extension 就無法向既有類新增屬性。

令人慶幸的是 Objective-C 的 關聯物件 可以緩解這種局面。例如要向一個工程裡所有的 view controllers 中新增一個 descriptiveName 屬性,我們可以簡單的使用 objc_get/setAssociatedObject()來填充其 get 和 set 塊

實現思路

1.在原有的Tabbar新增一個按鈕,將其放到指定位置(中間偏上)
2.這時候要注意tabbar的頂部黑線,需要對其進行隱藏或者設定透明顏色來去除

程式碼實現

extension UITabBar
{

    //關聯物件的ID,注意,在私有巢狀 struct 中使用 static var,這樣會生成我們所需的關聯物件鍵,但不會汙染整個名稱空間。

    private struct AssociatedKeys {
        static var TabKey = "tabView"
    }

    //定義一個新的tabbar屬性,並設定set,get方法
var btnTab:UIButton?{ get{ //通過Key獲取已存在的物件 return objc_getAssociatedObject(self, &AssociatedKeys.TabKey) as? UIButton } set{ //物件不存在則建立 objc_setAssociatedObject(self, &AssociatedKeys.TabKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } /** 新增中心按鈕 */ func AddMyCenterTab()->UIButton { if self.btnTab == nil { self.shadowImage = UIImage()//(49 - 42) / 2 let btn = UIButton(frame: CGRect.init(x: (WIDTH - 50) / 2, y: -14, width: 50, height: 50)) btn.autoresizingMask = [.FlexibleHeight,.FlexibleWidth] btn.setImage(UIImage.init(named: "工具"), forState: UIControlState.Normal) self.addSubview(btn) self.btnTab = btn } return self.btnTab! } }

實現時只需呼叫AddMyCenterTab()即可

下面來去除黑線:

        //邊框顏色
        self.tabBar.shadowImage = UIImage.init(color: bglightGray)
        self.tabBar.backgroundImage = UIImage.init(color: bglightGray)