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