Swift随笔 自定义tabBar样式工具栏

引言

UITabBar是iOS App中经常使用的系统控件,在实际的项目开发中,系统的UITabBar有时满足不了我们的需求,这是就需要自定义tabBar了。

这是我看MJ老师的新浪微博视频,然后转换成Swift语言自己写出来的,分享出来希望对大家有所帮助


自定义tabBar效果图.png

1.给工具栏添加背景

由于用的是iphone6的模拟器UITabBar高度是49,MJ老师给的素材是46,自己调了下,这里强烈建议用MJ老师MVC的思想,单独创建一个View,创建好之后,先添加一个背景,把图片平铺,代码如下

import UIKit

class Dock: UIView {

      var dock : UIView = UIView()

      override init(frame: CGRect) {

        super.init(frame: frame)

        self.frame = UIScreen.mainScreen().bounds

        self.backgroundColor = UIColor.init(patternImage:UIImage(named: "tabbar_background.png")!)
    }

      required init?(coder aDecoder: NSCoder) {
  
        fatalError("init(coder:) has not been implemented")

    }
}

2.添加Item的方法

上图中的Item有一个title,一个Image,还有选中时的Imge,所以我写这个方法的时候传入了三个值,这个方法,我们在主控制器中调用,代码如下

func addchildVC(Title:String,Image:String,SecletedImage:String)
    {
        let count  = self.subviews.count//当前View中subviews的个数
        let  ItemHeight : CGFloat = self.frame.size.height
        let  ItemWidth : CGFloat = self.frame.size.width / CGFloat(count)
        var  ItemBtn = Unbutton()
        ItemBtn.setTitle(Title, forState: UIControlState.Normal)
        ItemBtn.setImage(UIImage(named: Image), forState: UIControlState.Normal)
        ItemBtn.setImage(UIImage(named: SecletedImage), forState: UIControlState.Selected)
        ItemBtn.addTarget(self, action: Selector("ItemClick:"), forControlEvents: .TouchDown)

        self.addSubview(ItemBtn)
        //调整item的位置
        self.adjustDockItem()
    }

  • 调整Item的位置
    添加Item的方法有了,但是Item的位置和大小我们都没设置,逻辑就是我们的调用添加Item方法时是一个一个添加到自定义View上的,当添加第一个Item成功后,下面代码中的count个数就会变为1,我们添加第二个Item的时候,count变为2,Item的位置就会重新调整,代码如下 (这个方法的调用必须在添加ItemBtn之后,否则会报错)
func adjustDockItem()
    {
        let  count  = self.subviews.count
        let  ItemHeight : CGFloat = self.frame.size.height
        let  ItemWidth : CGFloat = self.frame.size.width / CGFloat(count )
        for i in 0..<count {
            //取出子空间
            let ItemBtn = self.subviews[i] as! UIButton
            ItemBtn.frame = CGRectMake(CGFloat(i) * ItemWidth, 0,ItemWidth ,ItemHeight)
        }
    }   
  • 点击按钮时选中并且将上一个按钮的选中状态取消
    思路很简单,创建一个变量,设定为当前为选中状态的按钮
var currentItem :UIButton = UIButton()
  func ItemClick(ItemBtn: DockItem){
        //让当前item取消选中
        currentItem.selected = false
        //让新的item选中
        ItemBtn.selected = true
        //让新的item变为当前item
        currentItem = ItemBtn
 }

3.在主控制器中调用添加Item的方法

  • 创建一个变量继承我们的View
var dock : Dock = Dock()
  • 调用添加Item的方法
import UIKit
class MainViewController: UITabBarController{
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.grayColor()
        self.addDock()
    }
    func addDock(){
        dock.frame = CGRectMake(0,self.view.frame.height - DockHeigt, self.view.frame.width, DockHeigt)
        self.view.addSubview(dock)
        dock.addchildVC("首页", Image: "tabbar_home.png", SecletedImage: "tabbar_home_selected.png")
        dock.addchildVC("消息", Image: "tabbar_message_center.png", SecletedImage: "tabbar_message_center_selected.png")
        dock.addchildVC("我", Image: "tabbar_profile.png", SecletedImage: "tabbar_profile_selected.png")
        dock.addchildVC("广场", Image: "tabbar_discover.png", SecletedImage: "tabbar_discover_selected.png")
        dock.addchildVC("更多", Image: "tabbar_more.png", SecletedImage: "tabbar_more_selected.png")
}

运行一下 看下效果图

自定义tabBar效果图.png

看下选中的效果图


选中效果图.png

有点点丑,发现位置好像不对,应该调整下ItemBtn里title和Image的位置,创建一个自定义Button,然后让我们的ItemBtn继承它就OK了

import UIKit
let kImageRatio : CGFloat = 0.6
class DockItem: UIButton {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        //文字居中
        self.titleLabel?.textAlignment = NSTextAlignment.Center
        self.titleLabel?.font = UIFont.systemFontOfSize(12)
        //图片自适应
        self.imageView?.contentMode = UIViewContentMode.ScaleAspectFit
        self.adjustsImageWhenHighlighted = false
        
        self.setBackgroundImage(UIImage(named: "tabbar_slider.png"), forState: .Selected)
//        self.setBackgroundImage(UIImage(named: "tabbar_slider.png"), forState: .Highlighted)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //重写UILabel边框
    override func titleRectForContentRect(contentRect: CGRect) -> CGRect{
        let Y = contentRect.size.height * kImageRatio
        let heigt = contentRect.size.height - Y
        return CGRectMake(0, Y, contentRect.size.width, heigt)
    }
    //重写UIImage边框
    override func imageRectForContentRect(contentRect: CGRect) -> CGRect {
        return CGRectMake(0, 0, contentRect.size.width, contentRect.size.height * kImageRatio)
    }
}

然后将上面代码中的UIButton全部改成DockItem

var ItemBtn = DockItem()
var currentItem : DockItem = DockItem()

进入时我们都是默认选中首页这个ItemBtn的,添加如下代码在adjustDockItem()方法中就可以了

if i == 0 
{
   ItemBtn.selected = true
   currentItem = ItemBtn
}

总结

遇到的主要问题还是设置ItemBtn位置,当时实在不理解是怎么添加的,不过后来还是解决了,希望能帮到大家,也希望能共同学习共同进步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • iPad开发与iPhone开发的异同简介1. iPad开发与iPhone开发的异同2. QQ空间的分析3. 登录界...
    JonesCxy阅读 951评论 1 5
  • 前言 很多时候,系统原生的 UITabBar 并不能满足我们的需求,譬如我们想要给图标做动态的改变,或者比较炫一点...
    四月_Hsu阅读 4,834评论 1 7
  • 简介 UITabBar是iOS App中经常使用的系统控件,比如知名App:新浪微博,微信,腾讯QQ等。在实际的项...
    清蘂翅膀的技术阅读 1,740评论 0 6
  • TabBarController是项目主要框架结构, 一般来说系统自带的TabBarController已足够使用...
    wolf_吴郎阅读 3,060评论 0 2
  • 歌酒阑干事已非,玉人惆怅捲罗帷;可堪荏苒争先谢,更不踌躇各自飞。 尽扫庭枝风敛怨,偶黏屋纲雨冲围;今朝蝶似长安客,...
    苏白杞阅读 512评论 0 12