同以往的文章,这篇同样属于个人笔记,只为以后不重复造轮子,不为装逼。
自定义TabBar我知道的两种方式
- 继承UITabBarController,在上次文章中《swift之自定义TabBarController》已经讲过
- 自定义TabBar继承UIView,就是现在要讲的方式。
第一步:
在UIViewController上拖一个UIView作为5个tab的container,然后当然是拖五个UIButton放进container里面,将五个UIButton的上下左右约束都设置为零(这个按个人需求设),再选中5个UIButton设置等宽约束(够直白了吧。。。别介意这是对以后的我说的。)
第二步:(高潮来了)
注册UIButton对应的UIViewController
func layoutUI() {
let _width = self.view.frame.width
let _height = self.view.frame.height - 49
self.homeVc = UIStoryboard.init(name: "Home", bundle: nil).instantiateViewControllerWithIdentifier("home_sid") as? NavigationController
self.homeVc!.view.frame = CGRectMake(0, 0, _width, _height)
//注册controller
self.addChildViewController(self.homeVc!)
self.discoverVc = UIStoryboard.init(name: "Discover", bundle: nil).instantiateViewControllerWithIdentifier("discover_sid") as? NavigationController
self.discoverVc!.view.frame = CGRectMake(0, 0, _width, _height)
self.addChildViewController(self.discoverVc!)
self.messageVc = UIStoryboard.init(name: "Message", bundle: nil).instantiateViewControllerWithIdentifier("message_sid") as? NavigationController
self.messageVc!.view.frame = CGRectMake(0, 0, _width, _height)
self.addChildViewController(self.messageVc!)
self.profileVc = UIStoryboard.init(name: "Profile", bundle: nil).instantiateViewControllerWithIdentifier("profile_sid") as? NavigationController
self.profileVc?.view.frame = CGRectMake(0, 0, _width, _height)
self.addChildViewController(self.profileVc!)
self.view.addSubview(self.homeVc!.view)
}
override func viewDidLoad() {
super.viewDidLoad()
self._btnHome.selected = true
layoutUI()
}
第三步:点击按钮切换controller
这里有两种方式
- 这种方式请参考http://www.tuicool.com/articles/3ymMzub 写的够仔细了。但是这种方式用在本项目会有一瞬间的闪屏,所以采用第二种方式。
- 本文采用的方式
func replaceController(newController: UIViewController) {
//判断即将显示的controller是否已经压入栈
if (newController.view.isDescendantOfView(self.view)) {
//将该controller放到容器最上面显示出来
self.view.bringSubviewToFront(newController.view);
}
else{
self.view.addSubview(newController.view)
}
}
结语:等项目做完放到github,待续......