如果上篇介紹的自定義TabBar的方式不能滿足項目的需求,那么我們可以徹底的拋棄系統的UITabBar,現在完全自定義一個繼承自UIView的TabBar。
這種方式也只要兩步即可。
一:
1,先自定義一個SinaTabBar繼承自系統的UIView
//自定義一個SinaTabBar
class SinaTabBar: UIView
2,重寫SinaTabBar的初始化方法,在初始化方法中添加若干個按鈕
首先,必須是自定義的按鈕,因為tabBar上面的按鈕沒有高亮點擊效果,所以要自定義按鈕去除高亮效果
class TabBarButton: UIButton {
override var isHighlighted: Bool {
set { } ?//set方法體為空,則該按鈕沒有點擊高亮效果
get {
return false
} } }
其次,重寫init方法,添加按鈕
let btnCount = 5 //注意:假如指定添加5個按鈕
init(frame: CGRect) {
? for index in 0..<btnCount { ?//for循環添加指定數量的按鈕
? ? ? ? super.init(frame: frame)
? ? ? ? //初始化按鈕并添加到父控件中
? ? ? ?let btn = TabBarButton(type: .custom)
? ? ? ?addSubview(btn)
? ? ? ?/*
? ? ? ? ? ? ? ? ? 在這里可以給按鈕設置選中圖片和默認圖片,文字等等
? ? ? ?*/
? ? ? //給按鈕添加事件響應方法 ??
? ? ? btn.addTarget(self, action: #selector(btnClick(btn:)), for: .touchDown
? }
}
這是按鈕點擊響應的方法
previousBtn是一個全局變量,記錄的是上一個被選中的按鈕
func btnClick(btn:UIButton) {
//取消上一個按鈕的選中
previousBtn?.isSelected = false
//選中當前按鈕
btn.isSelected = true
//當前按鈕記錄
previousBtn = btn
}
3,重寫layoutSubviews方法,在這個方法中給所有的子控件設置frame
override func layoutSubviews() {
let btnWidth = self.bounds.size.width / CGFloat(self.subviews.count)? //每個按鈕的寬度
let btnHeight = self.bounds.size.height //每個按鈕的高度,等于View的高度
let btnY = 0 //每個按鈕的Y值,
for index in 0..<self.subviews.count { ?//遍歷設置每個按鈕的frame
? ? ?? let btnX = btnWidth * CGFloat(index) ?//動態計算每個按鈕的X值 ? ?
? ? ? ?self.subviews[index].frame = CGRect(x: btnX, y: CGFloat(btnY),width: btnWidth, ?height: btnHeight)? //設置每個按鈕的frame值
}
}
二:
以下三小步是在tabBarController中執行的,self 就是tabBarController。
//1,實例化一個自定義的tabBar
let tabBarView = TabBarView()
//2,設置frame,就等于系統自帶的tabBar的frame
tabBarView.frame = self.tabBar.frame
//3,移除系統自帶的tabBar
self.tabBar.removeFromSuperview()
到這里一個完全自定義的tabBar就完成了。