自定义tabBar

自定义tabBar设置按钮,要首先确定系统的tabBar是什么时候添加上去的,怎么确定自定义的tabBar上添加上了四个tabBarButton这样你在添加自定义的按钮的时候就比较安全。
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);
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值