如果上篇介绍的自定义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就完成了。
网友评论