自定義TabBar(二)完全自定義TabBar樣式

簡(jiǎn)介

由于項(xiàng)目中需要改變TabBar的樣式阱佛,網(wǎng)上找了一些例子原环,發(fā)現(xiàn)這篇文章比較符合項(xiàng)目需求(先膜拜大神)箕肃,所以按照大神的思路坝锰,自己寫(xiě)了一個(gè)自定義TabBar粹懒,完整dome GitHub地址重付,這是另一種形式顷级,樣式自定義。
效果圖

Simulator Screen Shot 2017年8月14日 上午11.41.48.png

1. 先繼承UIView搭建tabBar的樣式确垫,封裝view沒(méi)什么難點(diǎn)弓颈,這里直接上代碼了

.h文件

#import <UIKit/UIKit.h>

@protocol CJTabBarViewDelegate <NSObject>
// 返回點(diǎn)擊index
- (void)selectIndex:(NSInteger)index;
// 點(diǎn)擊center
- (void)selectCenter;

@end

@interface CJTabBarView : UIView

@property (nonatomic, assign) id <CJTabBarViewDelegate> delegate;

@end

.m文件

#import "CJTabBarView.h"

@implementation CJTabBarView
{
    NSInteger saveIndex;// 保存上次點(diǎn)擊的index
}
#pragma mark 初始化
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        saveIndex = 100;
        [self createView];
    }
    return self;
}

#pragma mark 創(chuàng)建視圖
- (void)createView
{
    NSArray *titleArr = @[@"首頁(yè)", @"發(fā)現(xiàn)", @"收藏", @"設(shè)置"];
    NSArray *imageArr = @[@"wxb主頁(yè)", @"iconfont-yiqiyibiao", @"iconfont-xingxing", @"iconfont-jixieqimo"];
    NSArray *selectImageArr = @[@"wxb主頁(yè)-2", @"iconfont-yiqiyibiao-2", @"iconfont-xingxing-2", @"iconfont-jixieqimo-2"];
    // 設(shè)置item大小 根據(jù)項(xiàng)目具體情況修改
    CGFloat centerW = 80;
    CGFloat centerH = 60;
    CGFloat itemW = ([UIScreen mainScreen].bounds.size.width-80)/4.0;
    CGFloat itemH = 35;
    // 循環(huán)創(chuàng)建4個(gè)item
    for (int i = 0; i < imageArr.count; i++) {
        UIButton *item = [UIButton buttonWithType:UIButtonTypeCustom];
        item.frame = CGRectMake(itemW * i + centerW * (i/2), 0, itemW, itemH);
        // 對(duì),主頁(yè)的圖片還是那個(gè)灰的删掀,不懂的童鞋去看(一)翔冀,反正沒(méi)有影響
        [item setImage:[UIImage imageNamed:imageArr[i]] forState:UIControlStateNormal];
        [item setImage:[UIImage imageNamed:selectImageArr[i]] forState:UIControlStateSelected];
        [self addSubview:item];
        item.tag = 100+i;
        [item addTarget:self action:@selector(itemClick:) forControlEvents:UIControlEventTouchDown];
        
        UILabel *itemLabel = [[UILabel alloc] initWithFrame:CGRectMake(itemW * i + centerW * (i/2), itemH, itemW, 14)];
        itemLabel.text = titleArr[i];
        [self addSubview:itemLabel];
        itemLabel.font = [UIFont systemFontOfSize:10];
        itemLabel.textColor = [UIColor blackColor];
        itemLabel.tag = 200+i;
        itemLabel.textAlignment = NSTextAlignmentCenter;
        
        if (i == 0) {
            [self itemClick:item];
        }
    }
    // 創(chuàng)建center
    UIButton *center = [UIButton buttonWithType:UIButtonTypeCustom];
    center.frame = CGRectMake(itemW*2, 49-centerH, centerW, centerH);
    [center setImage:[UIImage imageNamed:@"08"] forState:UIControlStateHighlighted];
    [center setImage:[UIImage imageNamed:@"08"] forState:UIControlStateNormal];
    [self addSubview:center];
    [center addTarget:self action:@selector(centerClick:) forControlEvents:UIControlEventTouchDown];
}
#pragma mark item點(diǎn)擊事件
- (void)itemClick:(UIButton *)btn
{
    // 將之前點(diǎn)擊的item恢復(fù)原樣
    UIButton *tempB = [self viewWithTag:saveIndex];
    tempB.selected = NO;
    tempB.userInteractionEnabled = YES;
    
    UILabel *tempL = [self viewWithTag:saveIndex+100];
    tempL.textColor = [UIColor blackColor];
    
    // 將點(diǎn)擊的item變成選中狀態(tài)
    saveIndex = btn.tag;
    btn.selected = YES;
    btn.userInteractionEnabled = NO;
    
    UILabel *tempL1 = [self viewWithTag:saveIndex+100];
    tempL1.textColor = [UIColor colorWithRed:32/255.0 green:151/255.0 blue:217/255.0 alpha:1];
    
    if ([self.delegate respondsToSelector:@selector(selectIndex:)]) {
        [self.delegate selectIndex:btn.tag - 100];
    }
}
#pragma mark center點(diǎn)擊事件
- (void)centerClick:(UIButton *)btn
{
    if ([self.delegate respondsToSelector:@selector(selectCenter)]) {
        [self.delegate selectCenter];
    }
}

@end
2. 繼承UITabBar創(chuàng)建CJCustomTabBar 并在.h聲明CJTabBarView屬性
#import <UIKit/UIKit.h>
#import "CJTabBarView.h"

@interface CJCustomTabBar : UITabBar

@property (nonatomic, strong) CJTabBarView *tabBarView;

@end
3. 在.m中創(chuàng)建自定義tabBar
#pragma mark 初始化
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addSubview:self.tabBarView];
    }
    return self;
}
#pragma mark layout
- (void)layoutSubviews
{
    [super layoutSubviews];
    // 設(shè)置tabBarView的frame
    self.tabBarView.frame = self.bounds;
    // 把tabBarView帶到最前面,覆蓋tabBar的內(nèi)容
    [self bringSubviewToFront:self.tabBarView];
}

#pragma mark - getter
- (CJTabBarView *)tabBarView
{
    if (_tabBarView == nil) {
        _tabBarView = [[CJTabBarView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 49)];
    }
    return _tabBarView;
}

// 重寫(xiě)hitTest方法披泪,讓超出tabBar部分也能響應(yīng)事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (self.clipsToBounds || self.hidden || (self.alpha <= 0.01f)) {
        return nil;
    }
    UIView *result = [super hitTest:point withEvent:event];
    // 如果事件發(fā)生在tabbar里面直接返回
    if (result) {
        return result;
    }
    // 這里遍歷那些超出的部分就可以了纤子,不過(guò)這么寫(xiě)比較通用。
    for (UIView *subview in self.tabBarView.subviews) {
        // 把這個(gè)坐標(biāo)從tabbar的坐標(biāo)系轉(zhuǎn)為subview的坐標(biāo)系
        CGPoint subPoint = [subview convertPoint:point fromView:self];
        result = [subview hitTest:subPoint withEvent:event];
        // 如果事件發(fā)生在subView里就返回
        if (result) {
            return result;
        }
    }
    return nil;
}
4.創(chuàng)建CJTabBarController 繼承UITabBarController

.m文件

- (void)viewDidLoad {
    [super viewDidLoad];
    // 利用 KVC 來(lái)使用自定義的tabBar款票;
    CJCustomTabBar *tabBar = [[CJCustomTabBar alloc] init];
    [self setValue:tabBar forKey:@"tabBar"];
    tabBar.tabBarView.delegate = self;
    [self createControllers];
}
#pragma mark 創(chuàng)建controller
- (void)createControllers
{
    NSArray *titleArr = @[@"首頁(yè)", @"發(fā)現(xiàn)", @"收藏", @"設(shè)置"];

    for (NSInteger i = 0; i < titleArr.count; i++) {
        // 對(duì)應(yīng)controller
        UIViewController *VC = [[UIViewController alloc] init];
        VC.view.backgroundColor = [UIColor colorWithRed:255.0/3*i/255.0 green:255.0/3*i/255.0 blue:255.0/3*i/255.0 alpha:1];
        // 創(chuàng)建navigation
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:VC];
        // nav標(biāo)題
        VC.navigationItem.title = titleArr[i];
        // 添加
        [self addChildViewController:nav];
    }
}

#pragma mark CJTabBarView delegate
- (void)selectIndex:(NSInteger)index
{
    self.selectedIndex = index;
    NSLog(@"%ld", index);
}
- (void)selectCenter
{
    NSLog(@"center");
}

這樣樣式自定義tabBar就完成了控硼。由于部分方法、思路和(一)里相同艾少,這里就沒(méi)做過(guò)多解釋卡乾。

結(jié)語(yǔ):限于水平,本文只寫(xiě)了一些基本用法和注意事項(xiàng)缚够,如果文中存在錯(cuò)誤請(qǐng)指出幔妨,我會(huì)及時(shí)修改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谍椅,一起剝皮案震驚了整個(gè)濱河市误堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雏吭,老刑警劉巖锁施,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異思恐,居然都是意外死亡沾谜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)胀莹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)基跑,“玉大人,你說(shuō)我怎么就攤上這事描焰∠狈瘢” “怎么了栅螟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)篱竭。 經(jīng)常有香客問(wèn)我力图,道長(zhǎng),這世上最難降的妖魔是什么掺逼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任吃媒,我火速辦了婚禮,結(jié)果婚禮上吕喘,老公的妹妹穿的比我還像新娘赘那。我一直安慰自己,他們只是感情好氯质,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布募舟。 她就那樣靜靜地躺著,像睡著了一般闻察。 火紅的嫁衣襯著肌膚如雪拱礁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天辕漂,我揣著相機(jī)與錄音呢灶,去河邊找鬼。 笑死钮热,一個(gè)胖子當(dāng)著我的面吹牛填抬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隧期,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼飒责,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仆潮?” 一聲冷哼從身側(cè)響起宏蛉,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎性置,沒(méi)想到半個(gè)月后拾并,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹏浅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗅义,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐砸。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡之碗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季希,到底是詐尸還是另有隱情褪那,我是刑警寧澤幽纷,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站博敬,受9級(jí)特大地震影響友浸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偏窝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一收恢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囚枪,春花似錦派诬、人聲如沸劳淆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沛鸵。三九已至括勺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲掰,已是汗流浹背疾捍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栏妖,地道東北人乱豆。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吊趾,于是被迫代替她去往敵國(guó)和親宛裕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,119評(píng)論 25 707
  • 兩種方式: 1.在原 UItabBar 樣式的基礎(chǔ)上擴(kuò)展2.完全自定義 UITabBar 的樣式 效果預(yù)覽: 簡(jiǎn)介...
    記憶阿閱讀 27,622評(píng)論 21 99
  • 簡(jiǎn)介 UITabBar是iOS App中經(jīng)常使用的系統(tǒng)控件论泛,比如知名App:新浪微博揩尸,微信,騰訊QQ等屁奏。在實(shí)際的項(xiàng)...
    清蘂翅膀的技術(shù)閱讀 1,867評(píng)論 0 6
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)岩榆、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 歲月里有個(gè)少年 騎著車碾過(guò)古樹(shù)下細(xì)碎的陽(yáng)光 風(fēng)一樣坟瓢,來(lái)去自由 偌大的城市 這么多的繁華 似乎都不曾落在他清冷的眸里...
    澳洲小獸閱讀 222評(píng)論 0 1