MG--快速創(chuàng)建tabBarController

  • 前言:

    • 開發(fā)中,搭建項(xiàng)目的基本框架辖佣,都會(huì)使用TabbarContrller外加嵌套導(dǎo)航控制器去搭建霹抛,為了能夠快速搭建,節(jié)省開發(fā)時(shí)間卷谈,于是我會(huì)盡量偷懶杯拐,一些簡(jiǎn)單的代碼能盡量能不寫代碼就盡量不寫

TabBar控制器

  • 快速代建項(xiàng)目的基本框架
//  LYMMainTabBarVC.m
//  01 - MG的基本框架
//  Created by ming on 14/12/1.
//  Copyright ? 2014年 ming. All rights reserved.
//  說明:
/**
 *   參考代碼:具體類和圖片換一下即可用
 */

#import "LYMMainTabBarVC.h"
#import "LYMNavigationVC.h"
#import "LYMEssenceViewController.h"
#import "LYMNewViewController.h"
#import "LYMFriendViewController.h"
#import "LYMMeViewController.h"
#import "LYMTabBar.h"

@interface LYMMainTabBarVC ()<LYMTabBarDelaegate>

@end

@implementation LYMMainTabBarVC

- (void)viewDidLoad {
    [super viewDidLoad];
  
    // 1.當(dāng)系統(tǒng)的Tabbar滿足不了需求的時(shí)候,用自己的TabBar代替系統(tǒng)的TabBar
    // [self setValue:[[LYMTabBar alloc] init] forKey:@"tabBar"];
    
    // 2.初始化所有的自控制器
    [self setUpAllChildController];
    
}

#pragma mark ========= initialize ===========
+ (void)initialize{
    [[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"tabbar-light"]];
    NSDictionary *dict = @{
                           NSForegroundColorAttributeName:[UIColor grayColor]
                           };
    [[UITabBarItem appearance] setTitleTextAttributes:dict forState:UIControlStateNormal];
}

#pragma mark ========= 初始化所有的子控制器 =========
/**
 *  初始化所有的子控制器
 */
- (void)setUpAllChildController{
    // 1.精華界面
    LYMEssenceViewController *essenceCV = [[LYMEssenceViewController alloc] init];
    [self setNavOneChildViewController:essenceCV title:@"精華" image:@"tabBar_essence_icon" selImage:@"tabBar_essence_click_icon"];
    
    // 2.新手大廳
    LYMNewViewController *newVC = [[LYMNewViewController alloc] init];
    newVC.view.backgroundColor = [UIColor redColor];
    [self setNavOneChildViewController:newVC title:@"新帖" image:@"tabBar_new_icon"
        selImage:@"tabBar_new_click_icon"];
   
    // 3.朋友
    LYMFriendViewController *friendVC = [[LYMFriendViewController alloc] init];
    [self setNavOneChildViewController:friendVC  title:@"關(guān)注" image:@"tabBar_friendTrends_icon" selImage:@"tabBar_friendTrends_click_icon"];
    
    // 4.我
    LYMMeViewController *meVC = [[LYMMeViewController alloc] init];
    meVC.view.backgroundColor = [UIColor purpleColor];
    [self setNavOneChildViewController:meVC title:@"我" image:@"tabBar_me_icon"
        selImage:@"tabBar_me_click_icon"];
}

/**
 *  初始化一個(gè)子控制器的方法
 */
- (void)setNavOneChildViewController:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selImage:(NSString *)selImage {
    vc.tabBarItem.title = title;
    vc.tabBarItem.image = [UIImage imageNamed:image];
    vc.tabBarItem.selectedImage = [UIImage imageNamed:selImage];
    
    [self addChildViewController:[[LYMNavigationVC alloc] initWithRootViewController:vc]];
}

@end

導(dǎo)航控制器

  • 主要是重寫push方法和設(shè)置全局導(dǎo)航欄樣式世蔗,以及設(shè)置全局滑動(dòng)返回手勢(shì)
//  BSNavigationController.m
//  MGNaV
//  Created by ming on 14/12/17.
//  Copyright ? 2014年 ming. All rights reserved.

#import "BSNavigationController.h"

#define BSBarButtonItemFont [UIFont systemFontOfSize:15]

@interface BSNavigationController ()<UIGestureRecognizerDelegate>

@end

@implementation BSNavigationController
/** 
 *  為什么在這里設(shè)置端逼??污淋?
 *  設(shè)置導(dǎo)航欄全局樣式
 *  因?yàn)檫@個(gè)只需要設(shè)置一次顶滩,因?yàn)檫@個(gè)方法程序只會(huì)執(zhí)行一次
 */
+ (void)load{
    /// 1.UINavigationBar
    UINavigationBar *navBarAppearence = [UINavigationBar appearance];
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[NSFontAttributeName] = [UIFont systemFontOfSize:17];
    [navBarAppearence setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
    [navBarAppearence setTitleTextAttributes:dict];
    
    /// 2.UIBarButtonItem
    UIBarButtonItem *barItemAppearence = [UIBarButtonItem appearance];
    NSMutableDictionary *normalDict = [NSMutableDictionary dictionary];
    normalDict[NSForegroundColorAttributeName] = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
    normalDict[NSFontAttributeName] = BSBarButtonItemFont;
    [barItemAppearence setTitleTextAttributes:normalDict forState:UIControlStateNormal];
    
    NSMutableDictionary *highLDict = [NSMutableDictionary dictionary];
    highLDict[NSForegroundColorAttributeName] = BSGlobalBgColor;
    highLDict[NSFontAttributeName] = BSBarButtonItemFont;
    [barItemAppearence setTitleTextAttributes:highLDict forState:UIControlStateHighlighted];
}
/*
 <UIScreenEdgePanGestureRecognizer: 0x7fe260640220; view = <UILayoutContainerView 0x7fe26062bba0>;
 target= <(action=handleNavigationTransition:,
 target=<_UINavigationInteractiveTransition 0x7fe26063f1a0>)>>
 
 1.UIScreenEdgePanGestureRecognizer 加在導(dǎo)航控制器的view上
 
 2.target:_UINavigationInteractiveTransition(觸發(fā)手勢(shì)的對(duì)象)
 
 3.action: handleNavigationTransition:(這個(gè)方法系統(tǒng)內(nèi)部調(diào)用,不需要自己實(shí)現(xiàn))
 
 觸發(fā)UIScreenEdgePanGestureRecognizer就會(huì)調(diào)用target的handleNavigationTransition:方法
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    // UIScreenEdgePanGestureRecognizer
    // Do any additional setup after loading the view.
    // 只要觸發(fā)這個(gè)Pan手勢(shì),就會(huì)調(diào)用self對(duì)象pan方法
    // 1.創(chuàng)建全屏手勢(shì)
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
    
    // 控制手勢(shì)什么時(shí)候觸發(fā)
    pan.delegate = self;
    
    // 全屏滑動(dòng)返回
    [self.view addGestureRecognizer:pan];
    
    // 2.禁止邊緣手勢(shì)
    self.interactivePopGestureRecognizer.enabled = NO;
    
    // 實(shí)現(xiàn)滑動(dòng)返回功能
//    self.interactivePopGestureRecognizer.delegate = self;
    
    // bug:假死:程序一直運(yùn)行,但是界面動(dòng)不了.
    // 在根控制器的view,不需要滑動(dòng)返回,
    
    // 全屏滑動(dòng)返回
    // 研究下系統(tǒng)自帶的返回手勢(shì)
//    NSLog(@"%@",self.interactivePopGestureRecognizer.delegate);
}

#pragma mark - UIGestureRecognizerDelegate 
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    // 不是根控制器就實(shí)現(xiàn)滑動(dòng)返回功能
    return self.childViewControllers.count != 1;
}

// 攔截控制器的push操作
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // 判斷是否為根控制器
    if (self.childViewControllers.count > 0) { // 非根控制器
        // 統(tǒng)一設(shè)置設(shè)置返回按鈕
        UIBarButtonItem *backItem = [UIBarButtonItem itemWithImage:[UIImage imageNamed:@"navigationButtonReturn"] highImage:[UIImage imageNamed:@"navigationButtonReturnClick"] norColor:BSColor(66, 66, 66) selColor:BSColor(255, 0, 0) title:@"返回" target:self action:@selector(backClick)];
    
        viewController.navigationItem.leftBarButtonItem = backItem;
        
        // 2.隱藏底部TabBar導(dǎo)航條
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}

// 出棧
- (void)backClick{
    [self popViewControllerAnimated:YES];
}

@end

附注:當(dāng)系統(tǒng)的Tabbar滿足不了需求寸爆,很多時(shí)候礁鲁,Tabbar界面上都會(huì)有個(gè)發(fā)布(?)按鈕,這時(shí)候就需要自定義Tabbar赁豆,而此文就是為快速解決這個(gè)問題而生

######################### .h文件 #########################
//  BSTabBar.h
//  MGTabBar
//  Created by ming on 14/12/17.
//  Copyright ? 2014年 ming. All rights reserved.

#import <UIKit/UIKit.h>

@interface BSTabBar : UITabBar

/** 保存點(diǎn)擊plusButton按鈕之后要執(zhí)行的代碼 */
@property (nonatomic,strong) void(^operationBlock)();

@end

######################### .m文件 #########################
//  BSTabBar.m
//  MGTabBar
//  Created by ming on 14/12/17.
//  Copyright ? 2014年 ming. All rights reserved.

#import "BSTabBar.h"

@interface BSTabBar ()

/** 發(fā)布按鈕 */
@property (nonatomic,strong) UIButton *plusButton;
/** 記錄上一次點(diǎn)擊過的按鈕的Tag */
@property (nonatomic,assign) NSInteger previousClicktag;
/** 記錄上一次點(diǎn)擊過的按鈕 */
@property (nonatomic,strong) UIControl *previousClickTaBarButton;

@end

@implementation BSTabBar
/// 蘋果也是懶加載的
// 懶加載plusButton并初始化該按鈕
- (UIButton *)plusButton{
    if (!_plusButton) {
        _plusButton = [[UIButton alloc] init];

        [_plusButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
        [_plusButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
        
        [_plusButton sizeToFit];
        
        [self addSubview:_plusButton];
        
        // 監(jiān)聽按鈕的點(diǎn)擊
        [_plusButton addTarget:self action:@selector(plusButtonClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _plusButton;
}

// 重新布局TabBar的子控件
- (void)layoutSubviews{
    [super layoutSubviews];

    CGFloat width = self.width/( self.items.count + 1);
    CGFloat height = self.height;
    CGFloat x = 0;
    CGFloat y = 0;
    NSInteger i = 0;
    for (UIControl *tabBarButton in self.subviews) {
        if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
                if (i==2) {
                    i++;
                }
                x = i*width;
                tabBarButton.frame = CGRectMake(x, y, width, height);
                i++;
            
            tabBarButton.tag = i;
            [tabBarButton addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
            
            /// 短時(shí)間內(nèi)連續(xù)點(diǎn)擊仅醇,類似于鼠標(biāo)的雙擊事件
//             [tabBarButton addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchDownRepeat];
        }
    }
    
    // 計(jì)算plusButton的位置
    self.plusButton.center = CGPointMake(self.width*0.5, self.height*0.5);
}

#pragma mark - 操作
// 監(jiān)聽加號(hào)?按鈕的點(diǎn)擊
- (void)plusButtonClick{
    if (self.operationBlock) {
        self.operationBlock();
    }
}

/**
  *  重復(fù)點(diǎn)擊TabBar的按鈕,你想做什么事(比如:刷新界面)
 */
- (void)tabBarButtonClick:(UIControl *)tabBarButton{
    if (self.previousClicktag == tabBarButton.tag) {
        // 告訴其他人(按鈕被重復(fù)點(diǎn)擊了)
        [[NSNotificationCenter defaultCenter] postNotificationName:BSTabBarButtonRepeatClickNotification object:nil];
    }
    self.previousClicktag = tabBarButton.tag;
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魔种,一起剝皮案震驚了整個(gè)濱河市析二,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖叶摄,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属韧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛤吓,警方通過查閱死者的電腦和手機(jī)宵喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱衔,“玉大人樊破,你說我怎么就攤上這事∷纛恚” “怎么了哲戚?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艾岂。 經(jīng)常有香客問我顺少,道長(zhǎng),這世上最難降的妖魔是什么王浴? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任脆炎,我火速辦了婚禮,結(jié)果婚禮上氓辣,老公的妹妹穿的比我還像新娘秒裕。我一直安慰自己,他們只是感情好钞啸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布几蜻。 她就那樣靜靜地躺著,像睡著了一般体斩。 火紅的嫁衣襯著肌膚如雪梭稚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天絮吵,我揣著相機(jī)與錄音弧烤,去河邊找鬼。 笑死蹬敲,一個(gè)胖子當(dāng)著我的面吹牛暇昂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伴嗡,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼急波,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了闹究?” 一聲冷哼從身側(cè)響起幔崖,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤食店,失蹤者是張志新(化名)和其女友劉穎渣淤,沒想到半個(gè)月后赏寇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡价认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嗅定,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用踩。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠退,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脐彩,到底是詐尸還是另有隱情碎乃,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布惠奸,位于F島的核電站梅誓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏佛南。R本人自食惡果不足惜梗掰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗅回。 院中可真熱鬧及穗,春花似錦、人聲如沸绵载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尘分。三九已至猜惋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間培愁,已是汗流浹背著摔。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留定续,地道東北人谍咆。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像私股,于是被迫代替她去往敵國(guó)和親摹察。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容