viewDidLoad方法里是tabBarController加载完毕后调用的方法
给tabBar添加子控制器的目的是确定tabBar上有几个tabBarButton,我们看是否有可能给tabBarController设置子控制器的时候就已经添加好了所有的tabBarButton,那么如果这时候我们再设置自己的tabBar,有可能把系统的tabBar连同四个按钮替换掉,导致四个按钮没有添加上去,
尽量保证,我们先将系统的tabBar替换成我们自己的tabBar了之后,然后再添加四个按钮。
系统的tabBar什么时候添加四个按钮呢?
怎么测试呢?很简单,首先在ViewDidLoad方法里打印
在设置按钮内容之前和之后分别打印NSLog(@"%@",self.tabBar.subviews);
在给系统tabBar设置自定义tabBar的方法之前和之后都打印NSLog(@"%@",self.tabBar.subviews);看看有没有设置tabBar,没有的话就是安全的,
然后再viewWillAppear方法里出现了tabBar的打印结果,怎么确定是否再[super viewWillAppear]方法里设置四个按钮的位置呢?
怎么确定某个方法是否做了什么事情?
把这个方法注释掉,如果没有出现效果,则确定这个方法做了这件事情。
换句话就是只要我们再viewWillAppear之前替换掉系统的tabBar,那么自定义的tabBar就会添加上四个按钮。
先viewDidLoad再ViewWillApear
所以我们再viewDidload方法里替换了系统tabBar,保证了再四个按钮添加之前就做了替换,所以没有问题
关键代码 :
- (UIButton *)publishBtn{
if (!_publishBtn) {
UIButton * publishBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[publishBtn setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[publishBtn setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
//根据按钮的内容自适应
[publishBtn sizeToFit];
//因为是弱引用,所以按钮会被销毁
_publishBtn = publishBtn;
//解决:添加在控件上,就不会被销毁
[self addSubview:_publishBtn];
}
return _publishBtn;
}
//layoutsubviews方法可能频繁调用,所以添加控件的方法不要写在这里,用懒加载添加控件
//使用懒加载就需要声明
- (void)layoutSubviews{
[super layoutSubviews];
//得到tabBar下的按钮item的数量
NSInteger count = self.items.count+1;
CGFloat btnW = self.bounds.size.width/count;
CGFloat btnH = self.bounds.size.height;
NSInteger i = 0;
CGFloat btnY = 0;
for (UIView *view in self.subviews) {
if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
if (i==2) {
i+=1;
}
CGFloat btnX = btnW*i;
view.frame = CGRectMake(btnX, btnY, btnW, btnH);
i++;
}
}
// 不能用_publishBtn这个访问属性,不会去那个get方法
self.publishBtn.center = CGPointMake(self.bounds.size.width*0.5, self.bounds.size.height*0.5);
}