iOS:tintColor详解
什么是tintColor
tintColor是UIView的一个属性,属性返回一个UIColor对象。
tintColor的作用机制
作用机制有两个,分别为寻找和传递。寻找也就是通过get方法获取属性的值。传递也就是当主动改变tintColor时,tintColor是如何影响子视图的。
寻找过程:
- 寻找过程是从自己开始向父控件传递
- 如果找到了主动设置的tintColor,则停止寻找,返回改值
- 如果到了window层都没有找到,则返回的是UIWindow主动设定的蓝色tintColor
传递过程:
- 传递过程(影响范围)是从主动改变tintColor的那个视图开始向其子类传递
- 如果子视图的tintColor是通过父视图传递得到的(也就是不是主动设定的),那么就设置该子视图的tintColor属性并调用该子视图的tintColorDidChange方法
- 如果子视图的tintColor是主动设定的,则到此子视图终止且不会影响到这个子视图。从这个子视图开始,其下层的tintColor机制由这个子视图控制(也就是说这个主动设定tintColor的子视图的tintColor改变时才会影响该子视图下面的子视图)。
tintColor的作用原理
核心原理是tintColorDidChange方法。两种情况下会调用该方法:
- tintColor的值发生改变
- 子类的tintColor是通过继承(从superview传递)得到时,上层tintColor发生改变时
也就是说,tintColor只是提供一种颜色传递机制并在两种情况下主动调用该方法,所以如果系统没有实现对应的方法,那么需要自己去实现对应的方法来完成不同的效果。而UIButton中的systemStyle就是实现了该方法,custom的就没有实现。
验证
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];// 自定义的view实现了backgroundColor随着tintColore改变而改变TintColorView *v = [TintColorView new];v.frame = CGRectMake(0, 40, 200, 200);[self.view addSubview:v];UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];[btn setTitle:@"UIButtonTypeCustom按钮" forState:UIControlStateNormal];[btn setImage:[UIImage imageNamed:@"phone"] forState:UIControlStateNormal];btn.frame = CGRectMake(0, 280, 150, 90);[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];UIImage *oriImage = [UIImage imageNamed:@"phone"];UIImage *changeImage = [oriImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];TintColorBtn *btn2 = [TintColorBtn buttonWithType:UIButtonTypeCustom];btn2.adjustsImageWhenHighlighted = NO;[btn2 setTitle:@"自定义按钮" forState:UIControlStateNormal];// 这里如果设置的是oriImage,则点击btn2时,自身的image不会变化颜色[btn2 setImage:changeImage forState:UIControlStateNormal];btn2.frame = CGRectMake(200, 280, 150, 90);[btn2 addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn2];UIImageView *imageView = [UIImageView new];UIImage *image1 = [UIImage imageNamed:@"phone"];imageView.image = [image1 imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];imageView.frame = CGRectMake(200, 40, 40, 40);[self.view addSubview:imageView];UIImageView *imageView2 = [UIImageView new];// 这样设定时,不同于imageView,imageView2的图片颜色不会发生改变imageView2.image = [UIImage imageNamed:@"phone"];imageView2.frame = CGRectMake(200, 100, 40, 40);[self.view addSubview:imageView2];
}
TintColorBt继承自button,其中tintColorDidChange为:
- (void)tintColorDidChange {[self setTitleColor:self.self.tintColor forState:UIControlStateNormal];
}
点击事件:
- (void)btnClick {CGFloat red = (CGFloat)random() / (CGFloat)RAND_MAX;CGFloat blue = (CGFloat)random() / (CGFloat)RAND_MAX;CGFloat green = (CGFloat)random() / (CGFloat)RAND_MAX;// 注意:默认情况下,view的tintColor的改变并不会影响其backgroundColor的改变,如果需要这个功能,需要自定Viewself.view.tintColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}
结果:
延伸:
systemButton中设置:
btn.tintColor = [UIColor redColor];
结果:
只有自定的button颜色改变,因为tintColor传递终止了
tintColor不能使用pattern
pattern color就是通过image转换过来的color,使用如下:
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"tiny"]];
结果:
未解决的问题:
两个btn都不使用renderingModel为Template的image,会出现以下现象,点击自定的button时,图片颜色不改变,如下:
代码:
- (void)viewDidLoad {[super viewDidLoad];
// [self test1];self.view.backgroundColor = [UIColor whiteColor];UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];[btn setTitle:@"UIButtonTypeCustom按钮" forState:UIControlStateNormal];[btn setImage:[UIImage imageNamed:@"phone"] forState:UIControlStateNormal];btn.frame = CGRectMake(0, 280, 150, 90);[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];TintColorBtn *btn2 = [TintColorBtn buttonWithType:UIButtonTypeCustom];btn2.adjustsImageWhenHighlighted = NO;[btn2 setTitle:@"自定义按钮" forState:UIControlStateNormal];// 这里如果设置的是oriImage,则点击btn2时,自身的image不会变化颜色[btn2 setImage:[UIImage imageNamed:@"phone"] forState:UIControlStateNormal];btn2.frame = CGRectMake(200, 280, 150, 90);[btn2 addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn2];
}
自定义的btn中:
- (void)tintColorDidChange {[self setTitleColor:self.self.tintColor forState:UIControlStateNormal];UIImage *image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];self.imageView.image = image;
}
iOS:tintColor详解相关推荐
- IOS UIView详解
文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...
- FreeEIM 来点新知识iOS UIScrollView详解
老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...
- iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM
iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...
- iOS疯狂详解之AFNetworking图片缓存问题
AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...
- iOS多线程详解:实践篇
iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...
- iOS疯狂详解之开源库
youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...
- [iOS] 国际化详解
PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...
- UE4 IOS打包详解
写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...
- iOS模式详解runtime面试工作
简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...
- ios pods 详解
CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 ...
最新文章
- BAT 招聘岗位 100%都考的知识,你精通了吗?
- git上传提交遇到问题
- SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)
- leetcode 264. Ugly Number II
- ubuntu16 redis5.0以前版本集群部署示例
- MySQL基础之DML语句
- python requests 代理ip_python requests 测试代理ip
- 【活动预告】“智能医疗技术应用”线上论坛
- vs.php中使用apache或IIS7进行外部调试
- leetcode 240. 搜索二维矩阵 II
- 软件测试知识点 | Jmeter实现接口关联小结
- [转载] python实现一个简易的计算器
- Useful SQL script
- 苹果ttc转ttf_iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)
- 800份h5游戏源码
- 图扑软件基于钻孔数据的三维地质模型可视化
- matlab画进化树分析图,教你用ggtree绘制高颜值进化树
- Endnote X9软件关联WPS解决方案
- Excel技巧 - 办公提效
- 一对一网络课堂教室应用教程实例