Swift-自定制带有特殊按钮TabBar

封装了一个带有中间凸起的自定制Tabbar,包含4个普通按钮和中间的一个凸起按钮-

  1. 首先封装了一个UIButton,重新设置了UIButton的图片位置和label位置
  2. 使用便利构造器创建了一个带有imageview的构造方法,用来构造中间特殊的按钮
  3. 继承与UIView创建了一个自定制tabbar类,大小为屏幕宽度和49 高,
  4. 动态创建5个自定制的UIButton,对中间的按钮做了特殊处理,其中的位置大小可以根据需求设置。
  5. 设置一个全局的button存储高亮状态下的按钮
  6. 使用闭包进行了控制器于自定制tabbar之间的传值,实现了不同按钮切换不同界面的功能

使用方法:

  1. 实例化一个自定制TabBar let myTabbar = ZYF_Main_MyTabBar()
  2. 设置自定制TabBar的frame myTabbar.frame = CGRectMake(0, height - 49, width, 49)
  3. 调用方法,传入参数:标题数组、.Normal状态下的图片数组、.selected状态下的图片数组,每个按钮之间的间距
    tabbar.creatTabBar(title, imageNames: imageName, selectedImageNames: selectedImage, space: 83)

Github地址

上代码

封装UIButton,重置UIButton的图片位置和Label位置

class ZYF_MyTabBarButton: UIButton {
    //重写构造方法
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.frame = CGRectMake(0, 0, 49, 49)
        self.setTitleColor(UIColor.grayColor(), forState: .Normal)
        self.setTitleColor(UIColor.redColor(), forState: .Selected)
        self.titleLabel?.font = UIFont.systemFontOfSize(11)
        self.titleLabel?.textAlignment = .Center
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //重写button中图片的位置
    override func imageRectForContentRect(contentRect: CGRect) -> CGRect {
        return CGRectMake((contentRect.size.width - 30) / 2, 2, 30, 30)
    }
    //重写button中文本框的位置
    override func titleRectForContentRect(contentRect: CGRect) -> CGRect {
        return CGRectMake(0, contentRect.size.height - 17, contentRect.size.width, 15)
    }
    
    //使用便利构造器构造中间特殊按钮
    convenience init(frame: CGRect,image:String) {
        self.init(frame:frame)
        let imageView = UIImageView(frame: CGRectMake(0,0,70,70))
        imageView.image = UIImage(named: image)
        self.addSubview(imageView)
    }
}

继承UIView制作MyTabBar

class ZYF_Main_MyTabBar: UIView {
    //设置一个全局的button存储selected按钮
    var button = UIButton()
    //获得屏高
    let height = UIScreen.mainScreen().bounds.size.height
    //获得屏宽
    let width = UIScreen.mainScreen().bounds.size.width

    //闭包传值,创建一个闭包,用来传递被选中的按钮,以实现页面的转换
    var clickBlock:((selcted:Int) ->())?
    
    //重写构造方法
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.frame = CGRectMake(0, 0, width, 49)
        self.backgroundColor = UIColor.blackColor()
        //打开用户交互
        self.userInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //写一个制作方法,传图标题数组、图片名称数组、被选中状态下图片名称数组和每个按钮之间的间距
    func creatTabBar(titNames:[String],imageNames:[String],selectedImageNames:[String],space:Int) {
        //快速布局
        for i in 0...titNames.count - 1 {
            var btn = ZYF_MyTabBarButton(type: .Custom)
            btn.frame = CGRectMake(20 + CGFloat(i) * 83, 0, 49, 49)
            let image = UIImage(named: imageNames[i])
            let selectedImage = UIImage(named: selectedImageNames[i])
            
            //Mark*设置中间特殊按钮
            if i == 2{
            
                    
                //Mark* 如果想设置凸起的话让pointY为负值
                
                let pointY:CGFloat = 5
                let pointX:CGFloat = 49 + abs(pointY)
                btn = ZYF_MyTabBarButton.init(frame: frame, image: "ZYF-Login-Dou")
                btn.frame = CGRectMake(183, pointY, width / 5, pointX)
            } else {
                btn.setImage(selectedImage, forState: .Selected)
                btn.setImage(image, forState: .Normal)
            }
            
            
            btn.setTitle(titNames[i], forState: .Normal)
            self.addSubview(btn)
            btn.tag = 10 + i
            //为每个btn添加点击事件,以实现界面替换
            btn.addTarget(self, action: #selector(self.btnClick(_:)), forControlEvents: .TouchUpInside)
            
            //设置默认第一个按钮为选中状态
            if i == 0 {
                btn.selected = true
                self.button = btn
            }
        }
    }
    
    //点击事件
    func btnClick(sender:UIButton) {
        //实现视图切换
        print("视图切换")
        //通过tag值获取点击的btn
        let index = sender.tag - 10
        if index < 2 {
            //设置闭包中的值
            if clickBlock != nil {
                clickBlock!(selcted:index)
                print("index<2")
            }
        } else if index > 2 {
            if clickBlock != nil {
                clickBlock!(selcted:index - 1)
            }
        } else {
            clickBlock!(selcted:999)
            return
        }
        
        //设置选中按钮
        self.button.selected = false
        sender.selected = true
        self.button = sender
    }
}

使用方式


    //获取屏宽
    let width = UIScreen.mainScreen().bounds.size.width
    //获取屏高
    let height = UIScreen.mainScreen().bounds.size.height
    //实例化自定制TabBar
    let tabbar = ZYF_Main_MyTabBar()
        //隐藏系统的tabbar
        self.tabBar.hidden = true
        //设置位置
        tabbar.frame = CGRectMake(0, height - 49, width, 49)
        //标题数组
        let title = ["发现","关注","","消息","我的"]
        
        //图片名称数组
        let imageName = ["find","focus","center","message","contact"]
        
        //选中图片名称数组
        let selectedImage = ["sfind","sfocs","center","smessage","smy"]
        
        //创建按钮
        tabbar.creatTabBar(title, imageNames: imageName, selectedImageNames: selectedImage, space: 83)

        //使用闭包中的值
        tabbar.clickBlock = {(selcted:Int) in
            if selcted == 999 {
                print("点击了特殊按钮")
            } else {
                print(123)
                self.selectedIndex = selcted
            }
        }
        //将自定制tabbar加到主视图上
        self.view.addSubview(tabbar)
    

效果图如下:

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,631评论 4 59
  • 17品牌可以让消费者对质量比较放心 信息不完全会使人对优于自己预期的事物产生不信任感,进而可能会提高整个社会的运行...
    猪栏的理想阅读 158评论 0 0
  • 此时此刻坐在一个密闭屋子里写不出论文的我,眼前忽然缓慢放映过许多个烈日蓝天西瓜红的夏天。 好像每一个都是去年夏天,...
    Dawn_胖子阅读 587评论 0 2
  • 小明有一个天大的秘密,谁也不知道,他有一只鬼兄弟。 这在他很小的时候就发现了。 这只鬼兄弟从小和他一起长大,样子和...
    木子李小姑娘阅读 629评论 6 3
  • 其实所谓的让蛋白质占的比例较多,一方面是或许蛋白质确实对于运动比较适合,肯定也有一点,就是脂肪热量太大,通常吃一点...
    行者dx阅读 273评论 1 0