自定義TabBar02

在TabBar基礎(chǔ)上,在中間的位置加上一個Button,重新設(shè)置布局

custom_tabBar.png

新建一個類,繼承自TabBar

OC:

#import "JSTabBar.h"
#import "Masonry.h"

@interface JSTabBar ()
@property (nonatomic,strong) UIButton *composeButton;
@end

@implementation JSTabBar

- (instancetype)init{
    self = [super init];
    if (self) {
     
        //設(shè)置UI
        [self setUI];
        
    }
    
    return self;
}

- (void)setUI{
    
    [self addSubview:self.composeButton];
    [self.composeButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.mas_equalTo(self);
    }];
    
}

- (void)layoutSubviews{
    [super layoutSubviews];
    
    CGFloat width = [UIScreen mainScreen].bounds.size.width / 5;
    CGFloat index = 0;
    
    for (UIView *view in self.subviews) {
        
        if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            
            CGRect frame = view.frame;
            frame.size.width = width;
            frame.origin.x = index * width;
            view.frame = frame;
            
            index ++;
            
            if (index == 2) {
                index ++;
            }
            
        }
    }

}

//按鈕點擊事件中調(diào)用代理方法
- (void)buttonClick:(UIButton *)sender{
    
    if ([self.tabBarDelegate respondsToSelector:@selector(tabBarDelegateWithTabBar:)]) {
        [self.tabBarDelegate tabBarDelegateWithTabBar:self];
    }
}

/**
 *  ComposeButton懶加載
 *
 *  @return composeButton
 */
- (UIButton *)composeButton{
    
    if (_composeButton == nil) {
        _composeButton = [[UIButton alloc]init];
        [_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
        [_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
        [_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
        [_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
        [_composeButton sizeToFit];
        [_composeButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _composeButton;
}

@end

自定義的TabBar樣式完成,但此時還無法Push控制器,所以需要通過代理的方式,設(shè)置代理對象,進行Push操作

#import <UIKit/UIKit.h>

@class JSTabBar;
//聲明協(xié)議
@protocol JSTabBarDelegate <NSObject>

@optional
//聲明代理方法
- (void)tabBarDelegateWithTabBar:(JSTabBar *)tabBar;

@end

@interface JSTabBar : UITabBar
//聲明代理對象
@property (nonatomic,weak) id tabBarDelegate;
@end

Swift:

// MARK - 聲明協(xié)議
protocol JSTabBarDelegate : NSObjectProtocol {
    
    func tabBarComposeButtonClick()
}

class JSTabBar: UITabBar {
    
    //聲明代理對象
    weak var tabBarDelegate:JSTabBarDelegate?

    private lazy var composeButton: UIButton = {
        let btn = UIButton()
        btn.setImage(UIImage(named: "tabbar_compose_icon_add"), forState: UIControlState.Normal)
        btn.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), forState: UIControlState.Highlighted)
        btn.setBackgroundImage(UIImage(named: "tabbar_compose_button"), forState: UIControlState.Normal)
        btn.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), forState: UIControlState.Highlighted)
        btn.sizeToFit()
        return btn
        
    }()
    
    @objc private func composeButtonClick() -> Void {
        
        //代理對象執(zhí)行代理方法
        tabBarDelegate?.tabBarComposeButtonClick()
    }
    
    // MARK: -添加button
    func setupUI() -> Void {
        addSubview(composeButton)
    }
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI() //添加中間按鈕
        composeButton.addTarget(self, action: #selector(composeButtonClick), forControlEvents: UIControlEvents.TouchUpInside)
        
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        //設(shè)置中間按鈕的Frame
        composeButton.center.x = frame.size.width * 0.5
        composeButton.center.y = frame.size.height * 0.5
        
        //調(diào)整TabBar上button的Frame NSClassFromString("UITabBarButton")
        var index: CGFloat = 0
        let width: CGFloat = frame.width / 5
        for value in subviews {
            
            if value.isKindOfClass(NSClassFromString("UITabBarButton")!)  {
                
                value.frame.size.width = width
                value.frame.origin.x = index * width
                
                index++
                
                if index == 2 {
                    
                    index++
                }
                
            }
        }
    }
    
    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    

}

這樣自定義的TabBar就完成了,在使用上需要注意:
因為UITabBarController的tabBar為只讀屬性,所以無法按照正常方式設(shè)置,這里就需要通過KVC設(shè)置只讀屬性

在ViewDidLoad中

OC:

    JSTabBar *tabBar = [[JSTabBar alloc]init];
    tabBar.tabBarDelegate = self;
    [self setValue:tabBar forKey:@"tabBar"];

Swift:

   let tabBar = JSTabBar()
   tabBar.tabBarDelegate = self
   setValue(tabBar, forKey: "tabBar")

補充:
1.在OC中不能像Swift那樣直接設(shè)置frame屬性,需要借助中間變量
2.tabBar為只讀屬性,需要借助KVC設(shè)置
3.自定義布局完成后,還需要通過代理或者Block/閉包的方式委托控制器實現(xiàn)Push操作
4.Swift下重寫了init(frame: CGRect)方法,就不再支持xib和StoryBoard的方式,如果需要用到xib或storyBoard,需要自定義方法來創(chuàng)建TabBar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碌嘀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崇裁,更是在濱河造成了極大的恐慌铝宵,老刑警劉巖喂饥,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钙皮,死亡現(xiàn)場離奇詭異澎现,居然都是意外死亡延蟹,警方通過查閱死者的電腦和手機伏社,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門抠刺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摘昌,你說我怎么就攤上這事速妖。” “怎么了聪黎?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵罕容,是天一觀的道長。 經(jīng)常有香客問我稿饰,道長锦秒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任喉镰,我火速辦了婚禮旅择,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣姆。我一直安慰自己生真,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布捺宗。 她就那樣靜靜地躺著柱蟀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚜厉。 梳的紋絲不亂的頭發(fā)上长已,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音弯囊,去河邊找鬼痰哨。 笑死胶果,一個胖子當(dāng)著我的面吹牛匾嘱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播早抠,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼霎烙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悬垃,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤游昼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尝蠕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烘豌,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年看彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了廊佩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡靖榕,死狀恐怖标锄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茁计,我是刑警寧澤料皇,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站星压,受9級特大地震影響践剂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娜膘,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一舷手、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劲绪,春花似錦男窟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颤枪,卻和暖如春汗捡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畏纲。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工扇住, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盗胀。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓艘蹋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親票灰。 傳聞我的和親對象是個殘疾皇子女阀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫宅荤、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,131評論 4 61
  • 嗯哼嗯哼蹦擦擦~~~ 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 ...
    philiha閱讀 4,911評論 0 6
  • 1浸策、無法獲取storageInfo.requestQuota(stSize,getFS,qmError2);//2...
    kamin閱讀 280評論 0 0
  • 《望梅花2》 文/廖又蓉 血羹商鼎喜神悲冯键,象內(nèi)外、危墻刀影庸汗,奧宇瓊枝斑管窺惫确。...
    4182204ab311閱讀 234評論 2 8
  • 點擊上方【關(guān)注】按鈕,就可每期自動接受我們的漫話推送↑↑↑↑ 轉(zhuǎn)載合作或聊天請發(fā)簡信~~~
    慢漫來閱讀 10,807評論 123 270