扒取系统控件 设置系统控件属性

原创
2016/01/17 18:59
阅读数 178

比如 需要修改系统的badgeValue的背景图片

步骤:

1.可以打开渲染模式 选中要修改的控件

2.看顶部出现的控件的层次

3.将层次截取出来 并找出我们当前可以取到的控件 ,现在我们可以取到的控件就是tabbar 

4.然后在对应的控制器中 通过遍历控件的方式找到控件

private func demo {
        //取出我们可以取到的控件
        let tabbar = self.tabBarController!.tabBar
        
//根据我们截取的控件层次 遍历控件
        for tabbarChild in tabbar.subviews{
            
//判断遍历到的控件是否是我们想要的控件的类型
            if tabbarChild.isKindOfClass(NSClassFromString("UITabBarButton")!){
                
                for tabBarButtonChild in tabbarChild.subviews{
                    
                    if tabBarButtonChild.isKindOfClass(NSClassFromString("_UIBadgeView")!){
                        
                        for badgeViewChild in tabBarButtonChild.subviews{
                            if badgeViewChild.isKindOfClass(NSClassFromString("_UIBadgeBackground")!){         
                                
                         print("找到了")       
                            }
                            
                            
                        }
                    }
                    
    
                }
            
            }

        }
    }

5.通过上面的操作 已经将控件找到 ,接下来是要确定我们需要设置的控件的属性名字是什么 

print("找到了")                                

var count : UInt32 = 0

      //找到这个控件之后 开始设置它的属性 
                                
    /第一个参数 传入 类 第二个参数是 返回这个类的属性的个数
     ivarList = class_copyIvarList(NSClassFromString("_UIBadgeBackground")!, &count)
                                
     //根据个数 遍历属性
   for i in 0..<count{
                                    
      //获得属性
    let ivar = ivarList[Int(i)]
                                    
      //将属性转换为 int8
    let name = ivar_getName(ivar)
    type = ivar_getTypeEncoding(ivar)
                                    
      //将int8 转换为 字符串
    let nameStr = String(CString: name, encoding: NSUTF8StringEncoding)
    let typeStr = String(CString: type, encoding: NSUTF8StringEncoding)              
    print(nameStr)    //打印查看属性名称,打印结果 image 
    print(typeStr)    //打印查看属性类型,打印结果 UIImage 
}

6.获得控件和属性之后 通过kvc 模式给对应控件的属性进行赋值

badgeViewChild.setValue(UIImage(named: "main_badge"), forKeyPath: "_image")

总结 有几个比较有用的方法需要知道

1.判断是否是某一种类型的方法  以及通过字符串转换成类的方法

tabBarChild.isKindOfClass(NSClassFromString("UITabBarButton")!)

2.获取类的成员变量数组 的方法,按住option键后查看返回结果的类型并不是数组,但是可以遍历,遍历得到的数据是ivar ,

第一个参数传入一个类 第二个参数传入一个接收结果数量的地址

class_copyIvarList(NSClassFromString("_UIBadgeBackground")!, &count)

并且获取 类的“方法” “ 属性 ” “协议的方法类似  传的参数都是一样的


3.将ivar转换为Int8类型

ivar_getName(ivar)

方法都是有规律可循的,类似的 还有 


4.将Int8转换为字符串的方法

String(CString: name, encoding: NSUTF8StringEncoding)


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部