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