先来回顾一下UITabBarController
( 稍微详细的在在http://blog.csdn.net/yang198907/article/details/49807011)
伴随UITabBarController存在的一个控件叫做导航栏(UITabBar);
UITabBarController中有N个子控制器,那么在UITabBar中就会有N个UITabBarButton作为子控制器;

结构:


控制原理:1对应VC1,2对应VC2.....;



对应的UITabBarItem有相应的属性设置显示的内容,
eg:
标题文字
    @property(nonatomic,copy)NSString
*title;
     图标
    @property(nonatomic,retain)UIImage
*image;
     选中时的图标
    @property(nonatomic,retain)UIImage
*selectedImage;
     提醒数字
    @property(nonatomic,copy)NSString*badgeValue
典型的QQ案例:



什么时候需要自定义UITabBar
当UITabBarItem的默认功能显示不了我们的需求,或者说,我们想更加灵活的使用UITabBarItem的时候;
例如网易彩票:



注意️:文字和房子为一张图片
此时再去使用默认的UITabBarItem的属性设置就会有问题!
自定义UITabBar就派上用场了!


怎么实现自定义UITabBar?
先分析一下UITabBar的功能,点击UITabBarItem则会跳转到对应的控制器;
所以,我们只需要自定义一个UIView或者子类,然后再添加Button,点击Button时再跳转到对应的控制器就就可以了!

废话少说,上点代码:(代码实现了点击底部的button切换控制器)
步骤一:自定义UITabBarController
     1)创建YSCTabBarController类继承自UITabBarController
     2)创建
YSCTabBar类继承自
UIView,并添加3个Button模拟UITabBarItem;
   3)创建三个控制器继承自UIViewController

代码1:

            #import "YSCTabBarController.h"
#import "YSCTabBar.h"
#import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h" @interface YSCTabBarController () <YSCTabBarDelegate> @end @implementation YSCTabBarController - (void)viewDidLoad {
[super viewDidLoad];
[self loadViewVC];
YSCTabBar *tabBar = [[YSCTabBar alloc] initWithFrame:self.tabBar.frame WithCount:self.viewControllers.count];
tabBar.delegate = self;
[self.view addSubview:tabBar];
} - (void)loadViewVC {
OneViewController *oneVC = [[OneViewController alloc] init];
TwoViewController *twoVC = [[TwoViewController alloc] init];
ThreeViewController *threeVC = [[ThreeViewController alloc] init];
self.viewControllers = @[oneVC,twoVC,threeVC];
} - (void)yscTabbar:(YSCTabBar *)tabar index:(NSInteger)index {
self.selectedIndex = index;
}
@end



 代码2:

           #import "YSCTabBar.h"
@implementation YSCTabBar
- (instancetype)initWithFrame:(CGRect)frame WithCount:(NSInteger )count {
if (self = [super initWithFrame:frame]) { CGFloat W = [UIScreen mainScreen].bounds.size.width / count;
CGFloat H = 49; for (int i = 0; i < count; i ++) {
CGFloat X = i * W; UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(X, 0, W, H)];
btn.tag = i; btn.backgroundColor = [UIColor colorWithRed:((float)arc4random_uniform(256) / 255.0) green:((float)arc4random_uniform(256) / 255.0) blue:((float)arc4random_uniform(256) / 255.0) alpha:1.0];
[self addSubview:btn]; [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
}
return self;
} - (void)btnClick:(UIButton *)btn{ if ([self.delegate respondsToSelector:@selector(yscTabbar:index:)]) {
[self.delegate yscTabbar:self index:btn.tag];
}
}
@end


      代码3、

            #import "OneViewController.h"
@interface OneViewController ()
@end
@implementation OneViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
}
@end


步骤二
        代码创建实例化UIWindow并创建
YSCTabBarController:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; YSCTabBarController *tabVC = [[YSCTabBarController alloc] init];
self.window.rootViewController = tabVC; [self.window makeKeyAndVisible];
return YES;
}

效果图:


总结:UITabBarController给我们提供了一个非常好的选择哪个控制的属性,否则,我们还需要根据不同的;
                         eg:
            - (void)yscTabbar:(YSCTabBar*)tabar
index:(NSInteger)index {

               
self.selectedIndex=
index;
            }
此外,子控件让父控件做一些事情的时候,可以通过代理或者block来实现,本demo使用的是代理的方式;


基于此,我们还可以写出创建YSCTabBar类继承自UIScrollView
实现如下效果:
 




iOS-自定义 UITabBarController的更多相关文章

  1. iOS 自定义UITabBarController的tabBar

               #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDeleg ...

  2. 【iOS自定义键盘及键盘切换】详解

    [iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...

  3. iOS自定义的UISwitch按钮

    UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...

  4. 如何实现 iOS 自定义状态栏

    给大家介绍如何实现 iOS 自定义状态栏 Sample Code: 01 UIWindow * statusWindow = [[UIWindow alloc] initWithFrame:[UIAp ...

  5. 自定义UITabbarController控制器

    自定义UITabbarController控制器 这是定制UITabbarController的基本原理,没有进行功能性封装. 效果:   源码地址: https://github.com/YouXi ...

  6. iOS自定义组与组之间的距离以及视图

    iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...

  7. iOS 自定义转场动画

    代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...

  8. iOS 自定义转场动画浅谈

    代码地址如下:http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不 ...

  9. iOS自定义转场动画实战讲解

    iOS自定义转场动画实战讲解   转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...

随机推荐

  1. linux 被入侵后扫尾工作

    比较恶心,安装了后门,还把ssh sshd 给改了,服务器在机房,还不大好处理,如果贸然上去改,还容易把自己关在外面. 但是我有salt ,上面可以用cmd.run运行一切命令.不走sshd服务. l ...

  2. 解决yum 问题

    Dependencies Resolved Traceback (most recent call last): File "/usr/bin/yum", line 29, in ...

  3. 基于elementUI使用v-model实现经纬度输入的vue组件

    绑定一个 [12.34,-45.67] (东经西经,南纬北纬 正负表示) 形式的经纬度数组,能够按度分秒进行编辑,效果如下所示,点击东经,北纬可切换. 经纬度的 度转度分秒 能够获取度分秒格式数据 C ...

  4. Algorithms - Data Structure - Perfect Hashing - 完全散列

    相关概念 散列表 hashtable 是一种实现字典操作的有效数据结构. 在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 散列函数 hashfunction'h' 除法散 ...

  5. zookeeper配置集群报错Mode: standalone

    按照https://www.cnblogs.com/wrong5566/p/6056788.html 一步步配置好以后,老是启动显示Mode: standalone ,即单机模式启动. 经过排查,排除 ...

  6. 基本sql语法

    SQL 语句主要可以划分为以下 3 个类别. DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.常用 ...

  7. Istio ServiceEntry 引入外部服务

    概念及示例 使用服务入口Service Entry来添加一个入口到 Istio 内部维护的服务注册中心.添加了服务入口后,Envoy 代理可以向服务发送流量,就好像它是网格内部的服务一样.配置服务入口 ...

  8. sql-分组查询

    分组查询: 关键字:group by 可以将查询结果分组,并返回行的汇总信息 注意: 1.出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的 2.要筛选结果 可以先使用 ...

  9. maven中scope

    scope maven中scope的默认值是compilescope的分类1)compile 默认是compile.compile表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也参与其 ...

  10. 08 . Nginx状态码

    HTTP状态码 本篇文章主要介绍运维过程中经常遇到的状态码,并通过业界流行的Nginx进行模拟实现. 2XX状态码 2XX类型状态码表示一个HTTP请求成功,最典型的就是200 # 200状态码 # ...