Swift之TabBar上添加控件

在UITabbar的基础上使用Runtime来进行动态添加属性

效果如图:

运行时机制

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)
 

猜你喜欢

转载自blog.csdn.net/hengyunbin/article/details/85064282