iOS-自定义 UITabBarController

先来回顾一下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
实现如下效果:
 




 

转载于:https://www.cnblogs.com/yangsanchao/p/5014467.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值