简单实现自定义TabBar实现点击tabBarItem触发自定义

作者: AppleLSY | 来源:发表于2016-06-11 14:34 被阅读2899次

    这是我在简书的第二篇文章,一直以来都会想写些什么。但一个是怕,害怕写的不好而受到鄙视(想了半天不知道该用什么词,原谅我语文不好..),一个是懒。但当你真的去写过一次了,真的去做了,收获到一些“喜欢”,看着自己的文章被浏览的时候。你会发现,这件事你越来越想做了..所以有了这第二篇。好了,同样的开篇废话..下面言归正传:

    由于项目中的需求,所以要做自定义的tabBarController来实现点击tabBarItem实现分享和弹出自定义相机实现拍照,那么问题来了,系统自带的tabBarController只能实现页面的跳转,并且在点击tabBarItem时无法隐藏tabBar。那么只好自定义了,在网上查找了很多,发现都不符合自己的需求,所以就自己摸索出了一个,接下来上代码:

    • 首先我们创建一个继承UITabBarController的类
    -(void)viewDidLoad
    {
        [super viewDidLoad];
        
        HomeVC *homeVC = [[HomeVC alloc] init];
    
        UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:homeVC];
    
        UserVC *userVC = [[UserVC alloc] init];
        
        UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:userVC];
        
        CameraVC *cameraVC = [[CameraVC alloc] init];
        
        //删除原来的tabbar
        CGRect rect = self.tabBar.frame;
        
        [self.tabBar removeFromSuperview];  //移除TabBarController自带的下部的条
        
        //测试添加自己的视图
        _myView = [[UIView alloc] init];
    
        _myView.frame = rect;
        
        _myView.backgroundColor = [UIColor whiteColor];
        
        [self.view addSubview:_myView];
        
        //这里我只添加了三个controlelr,因为第四个item点击不出现视图,而是触发分享事件
        self.viewControllers = @[nav1,cameraVC,nav3];
        
        NSArray *norImgArr = @[@"home01",@"Camera01",@"urse01",@"share01"];
        
        NSArray *selImgArr = @[@"home02",@"Camera02",@"urse02",@"share02"];
        
        for (int i = 0; i < 4; i++)
        {
            _itemBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            
            float width = MainScreenBounds.size.width/4;
            
            _itemBtn.frame = CGRectMake(i*width+23, 0, 44, 44);
            
            [_itemBtn setBackgroundImage:[UIImage imageNamed:[norImgArr objectAtIndex:i]] forState:UIControlStateNormal];
            
            [_itemBtn setBackgroundImage:[UIImage imageNamed:[selImgArr objectAtIndex:i]] forState:UIControlStateSelected];
            
            _itemBtn.tag = i;
            
            [_itemBtn addTarget:self action:@selector(itemButtonClick:) forControlEvents:UIControlEventTouchUpInside];
            
            [_myView addSubview:_itemBtn];
            
            [self.btnArray addObject:_itemBtn];
        }
        
        //设置第一个button为选中状态
        ((UIButton *)[self.btnArray objectAtIndex:0]).selected = YES;
    }
    
    • 接下来是btn的点击事件
    - (void)itemButtonClick:(UIButton *)btn
    {
        self.selectedIndex = btn.tag;
        
        switch (btn.tag)
        {
            case 0:
            {
    
            }
                break;
            case 1:
            {
                NSLog(@"照相");
                
                //这里是点击相机的时候隐藏tabbar出现自定义相机界面
                _myView.hidden = YES;
            }
                break;
            case 2:
            {
    
            }
                break;
            case 3:
            {
                NSLog(@"分享");
                
                [self shareButtonClick];
            }
                break;
        
            default:
                break;
        }
        
        //点击其他button后第一个button改为非选中状态
        ((UIButton *)[self.btnArray objectAtIndex:0]).selected = NO;
        
        if (btn != _itemBtn)
        {
            _itemBtn.selected = NO;
            
            _itemBtn = btn;
        }
        
        _itemBtn.selected = YES;
    }
    
    哦了,就这么结束了..是不是很简单.. timg.jpeg

    下面是完成后的效果:

    录屏.gif

    接下来更新下信息,文章发布后也收到了读者们的质疑,确实,我尝试后发现,我之前用系统的使用不了的原因是没有走代理方法,我发现,如果设置rootViewController不在AppDelegate中的话,代理方法不走,因为我懒得删除创建工程师自动生成的viewController,所以把rootViewController写在里面了..

    但是,我还是倾向于我的这个方法,因为系统自带的虽然也能实现这个功能,但也要对创建一个viewController,然后让他不跳转页面,但不跳转页面的话,这个item会不显示selected状态,可能有方法来完美实现,只不过我没有研究到罢了...

    再次感谢大家的质疑了解答,希望这种分享的过程能持续下去,忘大家共同进步!

    相关文章

      网友评论

        本文标题:简单实现自定义TabBar实现点击tabBarItem触发自定义

        本文链接:https://www.haomeiwen.com/subject/fdosdttx.html