自定义TabBar(下,继承自UIView)

如果上篇介绍的自定义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..//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..//遍历设置每个按钮的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就完成了。

你可能感兴趣的:(自定义TabBar(下,继承自UIView))