还在用系统自带的?那你那就OUT了!

相信现在的APP10个里面有九个是有Tabbar的,但是很多人甚是很多公司都在用系统自带的tabbar。当然这也不是不可以,而且项目中就那几行代码,效果又一样。但是,别忘了还有一个但是。然并卵,这样并不符合苹果的设计理念。

好了 老规矩话不多说,先上图:

这个是高仿美团的tabbar。

接下来上主要代码吧:

自定义tabbar.h

@class JFTabBar;

//给每个按钮定义协议 与 方法
@protocol tabbarDelegate <NSObject>
@optional
-(void)tabBar:(JFTabBar * )tabBar didselectedButtonFrom:(int)from to:(int)to;
@end

@interface JFTabBar : UIView
@property (weak ,nonatomic)JFTabBarButton *selectedButton;
/**
 *  给自定义的tabbar添加按钮
 */
-(void)addTabBarButtonWithItem:(UITabBarItem *)itme;
@property(nonatomic , weak) id <tabbarDelegate> delegate;

自定义tabbar.m

#import "JFTabBar.h"
#import "JFTabBarButton.h"

@implementation JFTabBar

-(void)addTabBarButtonWithItem:(UITabBarItem *)itme{
    //1.创建按钮
    JFTabBarButton *button = [[JFTabBarButton alloc]init];
    [self addSubview:button];
    /*
     [button setTitle:itme.title forState:UIControlStateNormal];
     [button setImage:itme.image forState:UIControlStateNormal];
     [button setImage:itme.selectedImage forState:UIControlStateSelected];
     [button setBackgroundImage:[UIImage imageWithName:@"tabbar_slider"] forState:UIControlStateSelected];
     */
    //设置数据
    button.item = itme;

    //监听点击button
    [button addTarget:self  action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown];

    //默认选中
    if (self.subviews.count == 1) {
        [self buttonClick:button];
    }

}

/**
 * button监听事件
 *
 */
-(void)buttonClick:(JFTabBarButton*)button{

    if ([self.delegate respondsToSelector:@selector(tabBar:didselectedButtonFrom:to:)]
        )
    {
        [self.delegate tabBar:self didselectedButtonFrom:(int)self.selectedButton.tag to:(int)button.tag];
    }
    self.selectedButton.selected = NO;
    button.selected = YES;
    self.selectedButton = button;

}

-(void)layoutSubviews{
    [super layoutSubviews];

    CGFloat buttonW = self.frame.size.width/ self.subviews.count ;
    CGFloat buttonH = self.frame.size.height;
    CGFloat buttonY = 0 ;

    for ( int index = 0; index < self.subviews.count; index++) {
        //1.取出按钮
        JFTabBarButton *button = self.subviews[index];

        //2. 设置按钮的frame

        CGFloat buttonX = index * buttonW;

        button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH) ;

        //绑定tag;
        button.tag = index;
    }
}

继承tabbatControler.m

#import "JFTabBarViewController.h"
#import "JFTabBar.h"
#import "ViewController.h"
#import "JFMineViewController.h"
#import "JFMoreViewController.h"
#import "JFMerchantViewController.h"
#import "JFVisitViewController.h"

@interface JFTabBarViewController ()<tabbarDelegate>

@property(nonatomic ,strong)JFTabBar *costomTabBar;

@end

@implementation JFTabBarViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //初始化tabbar
    [self setUpTabBar];

    //添加子控制器
    [self setUpAllChildViewController];
}

//取出系统自带的tabbar并把里面的按钮删除掉
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];
    for ( UIView * child in  self.tabBar.subviews) {

        if ([child isKindOfClass:[UIControl class]]) {
            [child removeFromSuperview];
        }
    }
}

-(void)setUpTabBar{
    JFTabBar *customTabBar = [[JFTabBar alloc]init];
    customTabBar.delegate = self;
//    customTabBar.backgroundColor = [UIColor redColor];
    customTabBar.frame = self.tabBar.bounds;
    self.costomTabBar = customTabBar;
    [self.tabBar addSubview:customTabBar];

}
-(void)tabBar:(JFTabBar *)tabBar didselectedButtonFrom:(int)from to:(int)to{
    NSLog(@"%d, %d", from, to);
    self.selectedIndex = to;
    NSLog(@"%lu", (unsigned long)self.selectedIndex);

}

-(void)setUpAllChildViewController{
    ViewController *homeVC = [[ViewController alloc]init];
    [self setupChildViewController:homeVC title:@"首页" imageName:@"icon_tabbar_homepage" seleceImageName:@"icon_tabbar_homepage_selected"];

    JFVisitViewController *visitVC = [[JFVisitViewController alloc]init];
    [self setupChildViewController:visitVC title:@"上门" imageName:@"icon_tabbar_onsite" seleceImageName:@"icon_tabbar_onsite_selected"];

    JFMerchantViewController *merchantVC = [[JFMerchantViewController alloc]init];
    [self setupChildViewController:merchantVC title:@"商家" imageName:@"icon_tabbar_merchant_normal" seleceImageName:@"icon_tabbar_merchant_normal_selected"];

    JFMineViewController *mineVC = [[JFMineViewController alloc]init];
    [self setupChildViewController:mineVC title:@"我的" imageName:@"icon_tabbar_mine" seleceImageName:@"icon_tabbar_mine_selected"];

    JFMoreViewController *moreVC = [[JFMoreViewController alloc]init];
    [self setupChildViewController:moreVC title:@"更多" imageName:@"icon_tabbar_misc" seleceImageName:@"icon_tabbar_misc_selected"];

}

-(void)setupChildViewController:(UIViewController*)controller title:(NSString *)title imageName:(NSString *)imageName seleceImageName:(NSString *)selectImageName{
    controller.title = title;
    controller.tabBarItem.image = [UIImage imageNamed:imageName];
    controller.tabBarItem.selectedImage = [UIImage imageNamed:selectImageName];

    //包装导航控制器
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
    [self addChildViewController:nav];

    [self.costomTabBar addTabBarButtonWithItem:controller.tabBarItem];

}

以上是部分主要代码

有问题可以提出来。我们一起探讨。

祝好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 12:01:37

还在用系统自带的?那你那就OUT了!的相关文章

Win10系统自带输入法的人机交互设计

过了寒假回校以后,我的电脑重装了系统,为了提升系统运行的速度,自己装了一个内存条同时对硬盘进行了重新的分区,对电脑内的文件也进行了重新的整理,电脑的运行速度提高了很多.老多同学都说win10系统好用,因此,我也把电脑从原来的win7系统改成了win10,老师上完人机界面交互课程后,让我们评价一下当下正在使用的一款输入法,正好赶上我有话可说,我就来评价评价win10系统自带的收入法吧. 以前的win7系统上我下载了一个搜狗输入法,用起来感觉还不错,但是装完win10系统以后,我却没有再使用其他的输

ios程序如何实现系统自带的分享

ios系统自带的分享,支持的平台非常有限, 国内的只有 新浪微博和 腾讯微博,但是程序要求不多的话,也可以直接使用系统自带的分享,也比较简单. 首先,需要导入系统自带的框架  #import <Social/Social.h> // 1.判断平台是否可用(就是手机设置里 的新浪微博 和腾讯微博 有没有账号登录) if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) { UIAlertVi

利用命令行删除Android系统自带应用的方法

一般来说,手机厂家都会在手机中内置许多应用,而这些应用是使用一般的应用程序管理无法删除的.当然,现在有一些APP,如360和豌豆荚,在获取了系统的root权限之后是可以删除自带应用的.但是如果我不想让一个app来获取我的root权限呢?有没有方便.快捷的方法呢? 当然有,那就是利用shell命令.当然,首先要安装当前手机的驱动程序,否则无法进行调试. 在如何删除Android系统中的内置应用一文中作者也介绍了利用命令行删除系统应用的方法,但是个人感觉太麻烦了,其实有更简单的方法,只要三步即可:a

快速安装可视化IDS系统 (带视频)

快速安装可视化IDS系统 (带视频) 本节为大家介绍的软件叫安全洋葱Security Onion,根OSSIM一样,它是基于DebianLinux的系统,内部集成了很多开源安全工具,NIDS.HIDS.各种监控工具等等,下面我们就一起体会一下它如何进行深层防御. 为了了解这套系统,首先得教小白如何快速安装这套可用的IDS系统.先要准备实验用的ISO安装文件(下载地址:https://sourceforge.net/projects/security-onion/  ).接着进行如下操作: 1.将

Notepad2替代系统自带的记事本

事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢:但今天复制的内容中有很多数字和一些我不想要的内容,我想到了正则,发现系统自带的记事本没有,找来一个更强的工具,Word,继续查找替换,发现word中也没有正则,估计是微软认为除了程序员会正则,一般人不会用: 也许你会劝我使用:Notepad++.UltraEdit.editplus.EverNote.gVim,但我不太喜欢的原因是感觉还是有点重

仿快图系统自带图片浏览器应用源码项目

仿快图系统自带图片浏览器应用源码,最近在做一个微博i动态模块,需要查看他人相册照片或者微博内容图片等.看到QQ空间那个效果不错,尝试了不少方法来实现,均不是怎么理想.最初是想通过自定义GroupView和imageView来实现,结果在处理滑动事件和放大的图片拖曳不是很顺畅,自己也没深入解决,期望有高手实现了给分享下.后来看了网上的一些方法和帖子,尝试着拿别人的自定义包做一些修增自用.现在用gallery和imageVIew做的,感觉还不错.放上来最初的小demo,供大家参考分享. 源码下载:

系统自带的字体图标

诸如 Glyphicon 或者 FontAwesome 这样的图标字体应该你是知道的,但其实系统本来也是有一些字体图标的. 然后有幸查到了一些文档,罗列了许多系统自带的图标字体.先看一下: 有些图标还是不错的. 而且试坑的事情已经实验过了,删掉了近一半不能友好显示的. 实验了 windows,iphone,meizu,oppo,小米等设备,亲你可以大胆使用了.... 用起来也方便,直接在 :after 的 content 里面加上就行了. .icon:after {content: "\231A

使用系统自带的管理桌面快捷方式工具

你是不是还在为桌面繁多的快捷方式而苦恼,你是不是还在为经常更新管理快捷方式软件而忧虑,哈哈,接下来小编将为你呈现win7系统自带的快捷方式管理工具. 工具/原料 电脑 win7系统 方法/步骤 1 在你的任意磁盘上新建一个快捷方式管理文件夹,命名为“书桌”(可任意命名,此处为方便易记). 2 将你想使用的快捷方式拖放进来,当然也可以像这样一样建立二级目录 3 接下来,右键点击任务栏--工具栏--新建工具栏 4 在弹出的对话框中找到刚刚新建的“书桌”文件夹并选中,然后点击“选择文件夹” 5 现在观

替换Windows系统自带记事本

Windows自带的记事本打开一些简单的短小文本不错,但自带的这个记事本相应的也很残.比如查找替换功能,比如编码格式兼容问题- 为了使记事本使用更方便,我们有不少替代方案,比如 notepad2,notepad++,ultraedit- 个人比较喜欢notepad2-mod,替换分两种,一种直接改名为notepad.exe替换文件,另一种则是使用映像劫持,将名称为notepad.exe的进程劫持到我们指定的程序,以此实现启动记事本时打开我们要的notepad2.exe. 替换文件 Windows