如何修改系统控件
2015-12-19 16:42
148 查看
多数情况下, 系统原生控件太丑, 无法满足我们的需求. 那么系统控件如何修改呢?
思路:
找到你所需要更改的内容
使用KVC赋值
需求: 更改badgeValue的系统背景图片
![](http://img.blog.csdn.net/20151219154450144)
查看视图层级结构, 找到其View对应的位置
![](http://img.blog.csdn.net/20151219155332379)
那么接下来我们的任务是一层一层剥开它的心
从打印结果中找到我们需要的下一层 UITabBarButton
打印结果为:
![](http://img.blog.csdn.net/20151219170231515)
下一步目标为_UIBadgeView, 所以我们继续遍历
打印结果为:
![](http://img.blog.csdn.net/20151219171836685)
下一步目标: _UIBadgeBackground
KVC: 知道Value不知道key怎么办? 使用运行时
运行时可以获取一个对象身上的成员变量
注: 关键点在如何获取成员变量列表;
运行时有木有好强大
思路:
找到你所需要更改的内容
使用KVC赋值
需求: 更改badgeValue的系统背景图片
查看视图层级结构, 找到其View对应的位置
那么接下来我们的任务是一层一层剥开它的心
取出要更改的控件
for tabBarChild in (self.tabBarController?.tabBar.subviews)! { print(tabBarChild) }
从打印结果中找到我们需要的下一层 UITabBarButton
for tabBarChild in (self.tabBarController?.tabBar.subviews)!{ if tabBarChild.isKindOfClass(NSClassFromString("UITabBarButton")!){ print(tabBarChild) } }
打印结果为:
下一步目标为_UIBadgeView, 所以我们继续遍历
for tabBarChild in (self.tabBarController?.tabBar.subviews)!{ if tabBarChild.isKindOfClass(NSClassFromString("UITabBarButton")!){ for tabBarButtonChild in tabBarChild.subviews { if tabBarButtonChild.isKindOfClass(NSClassFromString("_UIBadgeView")!){ print(tabBarButtonChild) } } } }
打印结果为:
下一步目标: _UIBadgeBackground
for tabBarChild in (self.tabBarController?.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("终于等到你,还好没放弃\(badgeViewChild)") } } } } } }
给控件赋值
想要赋值, 属性点不出来怎么办? 使用KVCKVC: 知道Value不知道key怎么办? 使用运行时
运行时可以获取一个对象身上的成员变量
// 用于记录获取回来的成员变量是有多少个 var count: UInt32 = 0 // 通过运行时候,获取其身上的成员变量 // 参数1:传入 class,参数2: 传入一个指针,记录个数 let ivars = class_copyIvarList(NSClassFromString("_UIBadgeBackground")!, &count) // 遍历成员变量的列表 for i in 0..<count { // 取到对应位置的值 let ivar = ivars[Int(i)] // 获取其名字 let name = ivar_getName(ivar) let type = ivar_getTypeEncoding(ivar) // 转 NSString let nameString = NSString(CString: name, encoding: NSUTF8StringEncoding) let typeString = NSString(CString: type, encoding: NSUTF8StringEncoding) printLog("\(nameString)====\(typeString)") // 判断其对应属性, 通过 kvc 赋值其值 if nameString!.isEqualToString("_image"){ badgeViewChild.setValue(UIImage(named: "main_badge"), forKey: (nameString as! String)) }
注: 关键点在如何获取成员变量列表;
运行时有木有好强大
相关文章推荐
- 苹果官方的图标大小的调整
- PHP smarty模板技术
- Caused by: java.lang.ClassNotFoundException: org.springframework.expression.PropertyAccessor
- [工具]图片等比例压缩工具
- JavaScript 代码小片段
- delete和delete[]
- Dubbo简单小例子(结合spring)
- 初识ACM——活泼的精灵
- 网页中给超链接添加"是否确认"的方法
- android-studio导入-so文件的方法
- Objectiv-C NSValue类的常用方法
- iOS 中 当程序进入后台 但是程序员希望在程序进入后台的时候还可以运行一段代码时候可以做以下的操作
- How to set up Automation Tools
- Naive Bayesian(朴素贝叶斯)
- Socket接收少一个字节问题(XP系统)
- 初识ACM——这是程序的世界
- ❀自我唠嗑OC-字符串
- switf-基础03-类型安全与类型引用
- jquery mobile 移动web(5)
- Change auto-renaming in guake!!!!!!!!!!!!!!!!!!!!