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

比如 需要修改系统的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)


转载于:https://my.oschina.net/u/1476033/blog/603842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值