tabBar的定制

tabBar的定制

class YTTabBarController: UITabBarController {
    
    //MARK: - 屬性
    lazy var yt_tabBar:YTTabBar = {
    
        //自己定義的tabBar的大小和系統(tǒng)自帶的tabBar的大小一樣
        let tempTabBar = YTTabBar(frame:self.tabBar.bounds)
        
        //點(diǎn)擊tabBar上的按鈕去切換視圖控制器
        tempTabBar.changeSelectedIndex = {(index)in
        
            //切換到指定的視圖控制器
            self.selectedIndex = index
        }
        
        //將自定義的tabBar貼到系統(tǒng)的tabBar上
        self.tabBar.addSubview(tempTabBar)
        
        
        return tempTabBar
    }()

    //MARK: - 生命周期
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.selectedIndex = 0
        
        //創(chuàng)建子視圖控制器
        self.addController(OneViewController(), title: "one", imageName: "tiaoman_u", selectImageName: "despicable-me-2-minion-icon-5.png")
        self.addController(TwoViewController(), title: "two", imageName: "huiben_u", selectImageName: "despicable-me-2-minion-icon-4.png")
        self.addController(ThereViewController(), title: "there", imageName: "zhuanti_u", selectImageName: "despicable-me-2-minion-icon-3.png")
        self.addController(FourViewController(), title: "four", imageName: "wode_u", selectImageName: "despicable-me-2-minion-icon-2.png")
        
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
        //設(shè)置默認(rèn)選中的按鈕
        self.yt_tabBar.selectedIndex = self.selectedIndex
        
        //改變文字顏色
        self.yt_tabBar.titleColor = UIColor.lightGrayColor()
        
        //移除tabBar上自動(dòng)添加的所有的子視圖
        for item in self.tabBar.subviews {
            //判斷子視圖的類型是否是YTTabBar
            //isKindOfClass判斷指定的對(duì)象是否是指定的類型
            if item.isKindOfClass(YTTabBar.self) {
                continue
            }
            
            //將不是YTTabBar的從系統(tǒng)的tabBar上移除
            item.removeFromSuperview()
            
        }
        
    }
    
    
}

//MARK: - 添加子視圖控制器
extension YTTabBarController{
    
    ///添加子視圖控制器
    func addController(controller:UIViewController,title:String,imageName:String,selectImageName:String){
        
        //設(shè)置視圖控制器對(duì)一個(gè)的tabBarItem
        controller.tabBarItem.title = title
        controller.tabBarItem.image = UIImage.init(named: imageName)?.imageWithRenderingMode(.AlwaysOriginal)
        controller.tabBarItem.selectedImage = UIImage.init(named: selectImageName)?.imageWithRenderingMode(.AlwaysOriginal)
        //將視圖控制器添加到tabBarController中
        self.addChildViewController(controller)
        
        //在yt_tabBar上創(chuàng)建對(duì)應(yīng)按鈕
        self.yt_tabBar.addButtonWithItem(controller.tabBarItem)
        
    }
}

==============TabBar的定制========================
class YTTabBar: UIView {

    
    //MARK: - 屬性
    ///1.當(dāng)前選中的下標(biāo)
    var selectedIndex = 1
    
    ///2.聲明閉包用來(lái)傳值
    var changeSelectedIndex:((Int)->Void)? = nil
    
    ///3.設(shè)置按鈕的文字顏色
    var titleColor = UIColor.blackColor()
    
}

//MARK: - 添加按鈕
extension YTTabBar{

    ///添加按鈕
    func addButtonWithItem(item:UITabBarItem) {
        
        //創(chuàng)建按鈕
        let btn = YTTabBarButton(tabBarItem: item)
        //添加點(diǎn)擊事件
        btn.addTarget(self, action: "btnAction:")
        
        //設(shè)置按鈕的tag值
        btn.tag = 100+self.subviews.count
        
//        //判斷是否是需要選中按鈕
//        if self.selectedIndex == self.subviews.count{
//            
//            btn.isSelected = true
//        }
        
        //添加到界面上
        self.addSubview(btn)
    }
}

//MARK: - 按鈕點(diǎn)擊
extension YTTabBar{

    func btnAction(btn:YTTabBarButton){
        
        //將原來(lái)處于選中狀態(tài)的按鈕變成非選中狀態(tài)
        let selectBtn = self.viewWithTag(100+self.selectedIndex) as! YTTabBarButton
        selectBtn.isSelected = false
        
        //將當(dāng)前按下的按鈕變成選中狀態(tài)
        btn.isSelected = true
        //更新選中下標(biāo)
        self.selectedIndex = btn.tag - 100
        
        //通知tabBarController切換視圖控制器
        self.changeSelectedIndex!(self.selectedIndex)
        
    }
}

//MARK: - 計(jì)算子視圖的frame
extension YTTabBar{

    override func layoutSubviews() {
        super.layoutSubviews()
        
        //通用
        let btnW = self.frame.size.width / CGFloat(self.subviews.count)
        let btnH = self.frame.size.height
        let btnY:CGFloat = 0
        
        //遍歷拿到所有的按鈕
        for (i,item) in self.subviews.enumerate() {
            
            let btn = item as! YTTabBarButton
            
            let btnX = CGFloat(i) * btnW
            //1.設(shè)置frame
            item.frame = CGRectMake(btnX, btnY, btnW, btnH)
            
            //2.設(shè)置默認(rèn)選中的按鈕
            if i == self.selectedIndex {
                
                btn.isSelected = true
            }
            //3.設(shè)置按鈕顏色
            btn.titleLabel.textColor = self.titleColor
            
        }
        
        
        
    }
}
==========button的定制=================
//自定義控件:
//1.聲明所有的子視圖的屬性
//2.在構(gòu)造方法中將子視圖添加到界面上
//3.計(jì)算子視圖的frame


//1.小圖
//2.文字
//3.大圖
class YTTabBarButton: UIView {

    //MARK: - 屬性
    //1.小圖
    let smallImageView = UIImageView()
    //2.文字
    let titleLabel = UILabel()
    //3.大圖
    let bigImageView = UIImageView()
    
    ///4.按鈕的狀態(tài)
    var isSelected = false{
    
        didSet{
            
            if isSelected == true {
                
                self.bigImageView.hidden = false
            }else{
                self.bigImageView.hidden = true
            }
        }
    }
    
    //5.保存添加事件相關(guān)屬性
    var target: AnyObject? = nil
    var action: Selector? = nil
    

    //MARK: - 構(gòu)造方法
    init(tabBarItem:UITabBarItem){
        super.init(frame: CGRectZero)
        //1.小圖
        self.addSubview(self.smallImageView)
        self.smallImageView.image = tabBarItem.image
        self.smallImageView.contentMode = .Center
        //2.文字
        self.addSubview(self.titleLabel)
        self.titleLabel.text = tabBarItem.title
        self.titleLabel.textAlignment = .Center
        //3.大圖
        self.addSubview(self.bigImageView)
        self.bigImageView.image = tabBarItem.selectedImage
        self.bigImageView.contentMode = .Center
        self.bigImageView.hidden = true
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

//MARK: - 添加點(diǎn)擊事件
extension YTTabBarButton{

    ///添加事件
    func addTarget(target:AnyObject,action:Selector){
        
        self.target = target
        self.action = action
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        if self.target == nil {
            return
        }
        
         if (self.target!.respondsToSelector(self.action!) == true){
        
            self.target!.performSelector(self.action!, withObject: self)
        }else{
        
            print("按鈕點(diǎn)擊方法沒有實(shí)現(xiàn)")
        }
        
    }
    
    
}

//MARK: - 計(jì)算frame
extension YTTabBarButton{

    override func layoutSubviews() {
        super.layoutSubviews()
        
        //通用
        let btnW = self.frame.size.width
        let btnH = self.frame.size.height
        let imageProportion = CGFloat(4)/5
        let beyondH:CGFloat = 25
        //1.小圖
        let smallX:CGFloat = 0
        let smallY:CGFloat = 0
        let smallW = btnW
        let smallH = btnH * imageProportion
        self.smallImageView.frame = CGRectMake(smallX, smallY, smallW, smallH)
        //2.文字
        let titleX: CGFloat = 0
        let titleY: CGFloat = smallH
        let titleW = btnW
        let titleH = btnH * (1 - imageProportion)
        self.titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH)
        //3.大圖
        let bigX: CGFloat = 0
        let bigY = -beyondH
        let bigW = btnW
        let bigH = btnH + beyondH
        self.bigImageView.frame = CGRectMake(bigX, bigY, bigW, bigH)
        
        
        //判斷當(dāng)前按鈕是否處于選中狀態(tài)
        if self.isSelected {
            
            self.bigImageView.hidden = false
        }
        
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肝集,隨后出現(xiàn)的幾起案子育拨,更是在濱河造成了極大的恐慌嘱么,老刑警劉巖仇轻,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩焰,死亡現(xiàn)場(chǎng)離奇詭異欲主,居然都是意外死亡别凹,警方通過查閱死者的電腦和手機(jī)草讶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炉菲,“玉大人堕战,你說(shuō)我怎么就攤上這事∨乃” “怎么了嘱丢?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祠饺。 經(jīng)常有香客問我越驻,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任缀旁,我火速辦了婚禮记劈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘并巍。我一直安慰自己目木,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布懊渡。 她就那樣靜靜地躺著刽射,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剃执。 梳的紋絲不亂的頭發(fā)上誓禁,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音肾档,去河邊找鬼现横。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阁最,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骇两,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼速种,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了低千?” 一聲冷哼從身側(cè)響起配阵,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎示血,沒想到半個(gè)月后棋傍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡难审,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年瘫拣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片告喊。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麸拄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黔姜,到底是詐尸還是另有隱情拢切,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布秆吵,位于F島的核電站淮椰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜主穗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一泻拦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黔牵,春花似錦聪轿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至金赦,卻和暖如春音瓷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夹抗。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绳慎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漠烧。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓杏愤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親已脓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子珊楼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 先說(shuō)結(jié)論: 通過對(duì)一些第三方庫(kù)一些調(diào)研, 在 github 之上 , 筆者沒有找到特別高質(zhì)量且低耦合的第三方 自定...
    阿瑟李閱讀 4,471評(píng)論 4 4
  • 身為一個(gè)沒有女朋友的屌絲程序猿,幸虧還有蒼老師可以想想度液,看看厕宗。 帶小紅點(diǎn)的tabbar 其實(shí)這種情況比較簡(jiǎn)單,因?yàn)?..
    SunshineBrother閱讀 11,657評(píng)論 6 53
  • 在這里,你將要繼承于 UIImageview 自定制一個(gè) tabbar .效果如下: 1.首先你需要繼承于 UIB...
    Sparkle_S閱讀 567評(píng)論 0 0
  • 封裝了一個(gè)帶有中間凸起的自定制Tabbar堕担,包含4個(gè)普通按鈕和中間的一個(gè)凸起按鈕- 首先封裝了一個(gè)UIButton...
    Demoer閱讀 2,066評(píng)論 0 2
  • 跟一個(gè)每天愁眉苦臉已慢,負(fù)面情緒要多少有多少的人,天天在一起霹购,任憑自己本來(lái)有多快樂自在佑惠,也有情緒崩潰的一天。還總會(huì)懷疑...
    小仙女兒2014閱讀 2,922評(píng)論 1 0