Swift之自定義突出按鈕Tabbar
阿新 • • 發佈:2019-01-05
個人原創請勿轉載!謝謝
也不算是自定義一個Tabbar,而是在UITabbar的基礎上使用Runtime來進行動態新增屬性
效果如圖:
執行時機制
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)