什么是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详解相关推荐

  1. IOS UIView详解

    文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...

  2. FreeEIM 来点新知识iOS UIScrollView详解

     老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...

  3. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  4. iOS疯狂详解之AFNetworking图片缓存问题

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  5. iOS多线程详解:实践篇

    iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...

  6. iOS疯狂详解之开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  7. [iOS] 国际化详解

    PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...

  8. UE4 IOS打包详解

    写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...

  9. iOS模式详解runtime面试工作

    简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...

  10. ios pods 详解

    CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 ...

最新文章

  1. BAT 招聘岗位 100%都考的知识,你精通了吗?
  2. git上传提交遇到问题
  3. SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)
  4. leetcode 264. Ugly Number II
  5. ubuntu16 redis5.0以前版本集群部署示例
  6. MySQL基础之DML语句
  7. python requests 代理ip_python requests 测试代理ip
  8. 【活动预告】“智能医疗技术应用”线上论坛
  9. vs.php中使用apache或IIS7进行外部调试
  10. leetcode 240. 搜索二维矩阵 II
  11. 软件测试知识点 | Jmeter实现接口关联小结
  12. [转载] python实现一个简易的计算器
  13. Useful SQL script
  14. 苹果ttc转ttf_iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)
  15. 800份h5游戏源码
  16. 图扑软件基于钻孔数据的三维地质模型可视化
  17. matlab画进化树分析图,教你用ggtree绘制高颜值进化树
  18. Endnote X9软件关联WPS解决方案
  19. Excel技巧 - 办公提效
  20. 一对一网络课堂教室应用教程实例

热门文章

  1. Spring AOP实现及运行期调用原理分析
  2. Spring 常见注解原理和自定义@interface注解
  3. 使用Linux快速使用redis集群
  4. Docker备份镜像和重新载入镜像
  5. MyBatis入门使用及其四大核心对象
  6. springboot整合rabbitmq之消息的确认机制
  7. Facebook全面实施GDPR 用户Pages页面被随意锁定
  8. Java 小记 — RabbitMQ 的实践与思考
  9. 算法7-9:有向图搜索算法
  10. 浅谈Peer Review(同行评审)