Swift之自定义突出按钮Tabbar

来源:互联网 发布:word文档下载mac版 编辑:程序博客网 时间:2024/04/28 00:22

个人原创请勿转载!谢谢

也不算是自定义一个Tabbar,而是在UITabbar的基础上使用Runtime来进行动态添加属性

效果如图:

Tabbar效果展示,来自最近的我的项目

运行时机制

Runtime是一套比较底层的纯C语言的API, 属于C语言库, 包含了很多底层的C语言API。
在我们平时编写的iOS代码中, 最终都是转成了runtime的C语言代码。所谓运行时,也就是在编译时是不存在的,只是在运行过程中才去确定对象的类型、方法等。利用Runtime机制可以在程序运行时动态修改类、对象中的所有属性、方法等。

即使一行 Objective-C 代码也不写,每一个 Swift app 都会在 Objective-C runtime 中运行,开启动态任务分发和运行时对象关联的世界。更确切地说,可能在仅使用 Swift 库的时候只运行 Swift runtime。但 Objective-C runtime 与我们共处了如此长的时间,我们也应该将其发挥到极致。

涉及方法

关联对象(Associated Objects)
Swift extension 能对已经存在 Cocoa 类中添加极为丰富的功能,但它的兄弟 Objective-C 的 category 却逊色了不少。比如说 Objective-C 中的 extension 就无法向既有类添加属性。

令人庆幸的是 Objective-C 的 关联对象 可以缓解这种局面。例如要向一个工程里所有的 view controllers 中添加一个 descriptiveName 属性,我们可以简单的使用 objc_get/setAssociatedObject()来填充其 get 和 set 块

实现思路

1.在原有的Tabbar添加一个按钮,将其放到指定位置(中间偏上)
2.这时候要注意tabbar的顶部黑线,需要对其进行隐藏或者设置透明颜色来去除

代码实现

extension UITabBar{    //关联对象的ID,注意,在私有嵌套 struct 中使用 static var,这样会生成我们所需的关联对象键,但不会污染整个命名空间。    private struct AssociatedKeys {        static var TabKey = "tabView"    }    //定义一个新的tabbar属性,并设置set,get方法    var btnTab:UIButton?{        get{            //通过Key获取已存在的对象            return objc_getAssociatedObject(self, &AssociatedKeys.TabKey) as? UIButton        }        set{            //对象不存在则创建            objc_setAssociatedObject(self, &AssociatedKeys.TabKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)        }    }    /**     添加中心按钮     */    func AddMyCenterTab()->UIButton    {        if self.btnTab == nil        {            self.shadowImage = UIImage()//(49 - 42) / 2            let btn = UIButton(frame: CGRect.init(x: (WIDTH - 50) / 2, y: -14, width: 50, height: 50))            btn.autoresizingMask = [.FlexibleHeight,.FlexibleWidth]            btn.setImage(UIImage.init(named: "工具"), forState: UIControlState.Normal)            self.addSubview(btn)            self.btnTab = btn        }        return self.btnTab!    }}

实现时只需调用AddMyCenterTab()即可

下面来去除黑线:

        //边框颜色        self.tabBar.shadowImage = UIImage.init(color: bglightGray)        self.tabBar.backgroundImage = UIImage.init(color: bglightGray)
1 0