zoukankan      html  css  js  c++  java
  • 自定义tarBar

      使用tarBar大多数情况在我们都是默认的tarBarButton尺寸和位置但是如果我们想,希望像新浪微博那样的tarBar,就需要自定义了。

        

      1、本质上其实就是通过我们的主控制器中以KVC的方式重新构造我们新的tarBar,(http://www.cnblogs.com/daomul/p/4581717.html

        //更换系统的tabBar(KVC的形式,即使是只读的也可以修改)

          XBTabBar *tarBar = [[XBTabBar alloc]init];

          tarBar.delegate = self;//这个代理主要是针对点击事件的

          [self setValue:tarBar forKey:@"tabBar"];

      2、重新构造tarBar之后,在initWithFrame里面添加一个按钮到我们的tarBar中,由于重新添加子控件,所以会自动调用layoutSubviews方法。在layoutSubviews方法中我们重新排列对应的子控件的位置和尺寸(这里需要注意的是子控件需要判断是UITarBarButton,其中还有两个其他类型的子控件)

      3、对应的按钮的点击事件,在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器,所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出。顺序是:plusClick ——>tabBarDidClickButton

        #pragma  mark -- XBTarBarDelegate代理方法(这里是对应的主控制器被调用的方法)

        -(void)tabBarDidClickButton:(XBTabBar *)tarBar

        {

            UIViewController *VC = [[UIViewController alloc]init];

            VC.view.backgroundColor = [UIColor redColor];

            [self presentViewController:VC animated:YES completion:nil];

        }

    头文件:

     1 //
     2 //  XBTabBar.h
     3 //  XibaTest
     4 //
     5 //  Created by bos on 15-6-20.
     6 //  Copyright (c) 2015年 axiba. All rights reserved.
     7 //
     8 
     9 #import <UIKit/UIKit.h>
    10 
    11 @class XBTabBar;
    12 
    13 //1、因为XBtabBar继承自UITarBar,所以如果想建立自己的代理,也需要实现UITaBar的代理协议UITabBarDelegate
    14 @protocol XBTabBarDelegate <UITabBarDelegate>
    15 
    16 //2、设置可选的代理方法
    17 @optional
    18 -(void)tabBarDidClickButton:(XBTabBar *)tarBar;
    19 
    20 @end
    21 
    22 @interface XBTabBar : UITabBar
    23 
    24 //3、将协议作为一个属性放出来(代理弱指针)
    25 @property (nonatomic,weak) id<XBTabBarDelegate> delegate;
    26 
    27 @end

    代码文件:

     1 //
     2 //  XBTabBar.m
     3 //  XibaTest
     4 //
     5 //  Created by bos on 15-6-20.
     6 //  Copyright (c) 2015年 axiba. All rights reserved.
     7 //
     8 
     9 
    10 #import "XBTabBar.h"
    11 
    12 @interface XBTabBar()
    13 @property (nonatomic,weak) UIButton *composeBtn;
    14 @end
    15 
    16 @implementation XBTabBar
    17 
    18 -(instancetype)initWithFrame:(CGRect)frame
    19 {
    20     self = [super initWithFrame:frame];
    21     if (self) {
    22         
    23         //添加一个按钮到tabBar中
    24         UIButton *composeBtn = [[UIButton alloc]init];
    25         [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
    26         [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
    27         
    28         [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
    29         [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
    30         composeBtn.size = composeBtn.currentBackgroundImage.size;
    31         [composeBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];
    32         [self addSubview: composeBtn];
    33         
    34         self.composeBtn  = composeBtn;
    35     }
    36     return self;
    37 }
    38 
    39 -(void)plusClick
    40 {
    41     //在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器
    42     //所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出
    43     XBLog(@"11");
    44     
    45     //先判断是否存在对应的代理方法,然后执行代理的方法
    46     if ([self.delegate respondsToSelector:@selector(tabBarDidClickButton:)])
    47     {
    48         [self.delegate tabBarDidClickButton:self];
    49     }
    50 }
    51 
    52 -(void)layoutSubviews
    53 {
    54     [super layoutSubviews];
    55     
    56     //1、新增加的中间的按钮
    57     self.composeBtn.centerX = self.width *0.5;
    58     self.composeBtn.centerY = self.height *0.5;
    59     
    60     //2、设置其他tabbarButton的尺寸和位置
    61     
    62     CGFloat tabBarButtonW = self.width / 5;
    63     CGFloat tabBarButtonIndex = 0;
    64     for (UIView *childV in self.subviews)
    65     {
    66         //先判断是不是UITabBarButton的子控件(打印tarBar的子控件会发现还有其他两个子控件)
    67         Class class = NSClassFromString(@"UITabBarButton");
    68         if ([childV isKindOfClass:class]) {
    69             
    70             //重新设置TabBarButton子控件的宽度和X值(X值根据索引来定位值)
    71             childV.width = tabBarButtonW;
    72             childV.x = tabBarButtonIndex * tabBarButtonW;
    73             
    74             //增加索引,如果是第三个位置则跳过空一个位置给上面的Button
    75             tabBarButtonIndex++;
    76             if (tabBarButtonIndex == 2) {
    77                 tabBarButtonIndex++;
    78             }
    79         }
    80     }
    81 }
    82 
    83 @end
  • 相关阅读:
    xml根据属性去重。如csprj去重
    table中td的内容换行。
    基于jq的表单填充
    c#包含类文件到csprj中
    t4 根据表名数组生成实体
    js中找string中重复项最多的字符个数
    一步步配置cordova android开发环境
    .net framework卸载工具
    Sql Server查询视图和表
    DbHelper.ttinclude 更新,查询视图和表
  • 原文地址:https://www.cnblogs.com/daomul/p/4662802.html
Copyright © 2011-2022 走看看