• 自定义tabBar


    ★★★★自定义tabBar★★★★★★★

    Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git

    前言:

    有的时候需求要对tabBar进行自定义的时候,感觉还是有很多不明白的地方,特此写一个demo来记录,大家可以借鉴这个思路仿写一个属于自己的tabBar。我写的并不好,有错误的地方,请大家指出来,我好马上修改,谢谢。

    思路是自定义tabBarController中设置2个一个是ViewController子视图和tabBar 在ViewController中设置4个子视图

    一、设置所有子视图

    //添加所有子视图
    - (void)setAllChildViewController
    {
        
        
        //第一页
        XLJFirstController *first = [[XLJFirstController alloc] init];
        
        [self setOneChildViewController:first withNormalImage:[UIImage imageNamed:@"tabbar_home"] withSelectedImage:[UIImage imageNamed:@"tabbar_home_selected"] withTitle:@"first"];
        
        //第二页
        XLJSecondController *second = [[XLJSecondController alloc] init];
        
        [self setOneChildViewController:second withNormalImage:[UIImage imageNamed:@"tabbar_message_center"] withSelectedImage:[UIImage imageNamed:@"tabbar_message_center_selected"] withTitle:@"second"];
    
        //第四页
        XLJFourController *four = [[XLJFourController alloc] init];
        
        [self setOneChildViewController:four withNormalImage:[UIImage imageNamed:@"tabbar_discover"] withSelectedImage:[UIImage imageNamed:@"tabbar_discover_selected"] withTitle:@"four"];
    
        //第五页
        XLJFiveController *five = [[XLJFiveController alloc] init];
        
        [self setOneChildViewController:five withNormalImage:[UIImage imageNamed:@"tabbar_profile"] withSelectedImage:[UIImage imageNamed:@"tabbar_profile_selected"] withTitle:@"five"];
    
    }
    

    二、设置自定义tabBar

    //自定义tabBar,自定义的方法类似
    - (void)setUpTabBar
    {
        XLJTabBar *tabBar = [[XLJTabBar alloc] initWithFrame:self.tabBar.bounds];
        
        tabBar.backgroundColor = [UIColor lightGrayColor];
        tabBar.delegate = self;
        tabBar.items = self.items;
        
        [self.tabBar addSubview:tabBar];
    }
    

    1. 在自定义tabBar的时候,创建XLJTabBar类,让它继承自UIView,这个类要做哪些事情呢?主要做布局的事情,有普通的按钮和一个图片的按钮,他们的事件通过代理的方式来实现。

    位置的计算方法(其它方法根据自己的来写):

    //调整子控件的位置
    - (void)layoutSubviews
    {
        [super layoutSubviews];   
        CGFloat w = self.bounds.size.width;
        CGFloat h = self.bounds.size.height;
        
        CGFloat btnX = 0;
        CGFloat btnY = 0;
        CGFloat btnW = w / (self.items.count + 1);
        CGFloat btnH = h;
        
        int i = 0;
        //设置tabBarButton的frame
        for (UIView *tabBarButton in self.buttonmArray) {
            if (i == 2) {
                i = 3;
            }
            btnX = i * btnW;
            tabBarButton.frame = CGRectMake(btnX, btnY, btnW, btnH);
            i++;
        }
        
        //设置添加按钮的位置
        self.plusButton.center = CGPointMake(w * 0.5, h * 0.5);
        
    }
    

    三、移除系统的tabBarButton的方法

    /移除系统自带的tarBar
        for (UIView *tabBarButton in tabBarVc.tabBar.subviews) {
            if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
                [tabBarButton removeFromSuperview];
            }
        }

    四、处理Navigation手势滑动的问题

    
    #import "XLJNavigationController.h"
    #import "UIBarButtonItem+XLJButtonItem.h"
    
    @interface XLJNavigationController ()<UINavigationControllerDelegate>
    //用于返回手势标记
    @property (nonatomic, strong) id popDelegate;
    
    @end
    
    @implementation XLJNavigationController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.popDelegate = self.interactivePopGestureRecognizer.delegate;
        self.delegate = self;
    }
    
    
    //导航控制器跳转完成的时候调用
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        if (viewController == self.viewControllers[0]) {
            self.interactivePopGestureRecognizer.delegate = self.popDelegate;
        }else{
            //实现滑动返回功能
            self.interactivePopGestureRecognizer.delegate = nil;
        }
    }
    

    五、未解决问题appearanceWhenContainedIn在iOS9以后这个就会出现警告的问题,希望知道的朋友帮忙解决.iOS9以后说是用这个但是不会,一用就崩溃了。

     UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UIBarButtonItem class]]];

    PS:效果图

  • 相关阅读:
    WebService中Dataset的压缩序列化和解压反序列化(DataSetSurrogate的使用)
    IOleControl 代码一,测试有问题,备忘
    关于Stream和byte之间的转换 .
    webbrowser 实现IOleControl接口2
    JavaScropt获取网页、浏览器、屏幕高度和宽度
    Oracle默认的用户名和密码
    window.showModalDialog()用法及注意事项
    Android1.6开发环境配置
    string与stream互相转换
    GirdView实现单选、FooterTemplate实现新建和PagerTemplate实现分页
  • 原文地址:https://www.cnblogs.com/marlonxlj/p/5978779.html
Copyright © 2020-2023  润新知