1. 问题描述

当输入框 UITextField 的背景比较深的时候,它自带的 clearButton 就会变得几乎不可见,但是 UIKit 框架中提供的 clearButtonMode 属性只能用于控制 clearButton 的出现时机,并不能对其样式进行更改。

由于那自带的样式无法让我们顺利通过 UI 走查,我们就需要获取到 UITextField 中的私有属性 clearButton,然后对其样式进行修改。

2. 解决方案

方法一:

我们可以利用 KVC 进行 clearButton 的获取,这是一种非常简便的方式,实现代码如下:

UIButton *cancelBtn = [_textField valueForKey:@"_clearButton"];
// 在此处进行 clearBtn 样式的设置
NSLog(@"%@", clearBtn);

但是,KVC 在用于获取类的私有属性的时候,是存在一定风险的,尤其是对于官方和第三库中类的私有属性,因为当他们对属性的名称进行修改,KVC 会无法找到对应的值就会引起应用奔溃,这一点要时刻铭记!

方法二:

另一个办法是通过写一个继承自 UITextField 的类,在 layoutSubviews 方法中利用递归遍历子控件的方法去获取 clearButton。相关代码如下:

@interface VGTextField : UITextField@end@implementation VGTextField- (void)layoutSubviews {[super layoutSubviews];UIButton *clearBtn = [self _clearButtonInView:self];// 在此处进行 clearBtn 样式的设置NSLog(@"%@", clearBtn);
}/// 递归遍历子控件,获取 clearButton
/// @param view  clearButton 对应的父 UITextField
- (UIButton *)_clearButtonInView:(UIView *)view {if ([view isKindOfClass:[UIButton class]] || [view isKindOfClass:[NSClassFromString(@"_UITextFieldClearButton") class]]) {return (UIButton *)view;}for (UIView *subView in view.subviews) {UIView *button = [self _clearButtonInView:subView];if (button) {return (UIButton *)button;}}return nil;
}@end

这也是我目前使用的实现方法,虽然看起来代码比较多,但是相对安全,不会引起程序崩溃。

也许有同学有疑问,为什么要重写一个类,直接在 UITextField 对象创建的时候直接调用递归查找子控件的方式去获取不久好了吗?

只可惜,在 UITextField 对象刚创建的时候,也许是因为懒加载之类的因素,clearButton 还没有被添加到该对象中,我们无法获取。只有当输入框中有文字输入时,clearButton 才能被获取到,这便是我们需要重写一个类的原因。

3. 实现效果

当我们获取到 clearButton 之后,给按钮更换样式什么的还不是手到擒来的事情吗?

下图便是给 clearButton 更换新图片的结果,是不是学到新招了呢?别忘了点赞哦~

iOS - 修改 UITextField 的 clearButtton 样式相关推荐

  1. iOS 修改搜索框的样式为白色

    2019独角兽企业重金招聘Python工程师标准>>> //思路:正常SearchBar有一个灰色环绕边框,在searchBar外层加一个白色的背景,这个背景只够包围searchBa ...

  2. iOS 修改文字大小以适配lable高度宽度

    iOS 修改文字大小以适配lable高度宽度 在开发中,我们也许会遇到根据文字多少动态修改lable的高度,但也有lable高度和宽度是固定的,这个时候如果想让文字显示完全,就必须修改文字字体大小.动 ...

  3. 【百度地图API1.1】修改文本标注的样式

    原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...

  4. CSS/Compass修改placeholder的文字样式

    在HTML5中,<input>与<textarea>标签支持placeholder属性,用来定义无任何输入时的默认文字. 可以通过CSS修改placeholder的文字样式: ...

  5. iOS 修改项目名称

    2019独角兽企业重金招聘Python工程师标准>>> 1. [代码]iOS 修改项目名称 1 2. [图片] 1.png 3. [图片] 2.png 4. [图片] 3.png 5 ...

  6. zblog php 侧边栏样式,ZBlogPHP免费主题Blogs如何修改侧边栏搜索框样式?

    老古偶尔访问有某些使用 ZBlogPHP 免费主题 Blogs 的站点,发现他们的侧边栏搜索框样式都比较丑,一看就知道这些站长都没有认真阅读Blogs 主题介绍页,因为介绍页中的第四大点侧边栏模块使用 ...

  7. [vue-element] ElementUI怎么修改组件的默认样式?

    [vue-element] ElementUI怎么修改组件的默认样式? 方法一:/deep/ 方法二:>>> 方法三:在外层添加一层div,设置自定义类名,再修改里边的样式, 格式. ...

  8. IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容

    IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容 UIAlertController *alertVC = [UIAlertController alertControl ...

  9. iOS 修改webView字体

    五中方案 UIFont *font = [UIFont systemFontOfSize:12];//方法一NSString *fontColor =@"CCCCFF";NSStr ...

最新文章

  1. 创新工场2018年夏令营DeepCamp第一套解答笔记
  2. (Java)关于泛型
  3. java 多线程性能_Java中多线程的性能比较
  4. 六度分离(HDU-1869)
  5. Apache Cassandra和Apache Ignite:分布式数据库的明智之选
  6. PAT 乙级 1046. 划拳(15) Java版
  7. POJ 1703 Find them, Catch them 并查集
  8. ubuntu 搜狗输入法的安装
  9. sqlmap入门使用教程
  10. UE4官方文档UI学习:6. UMG 使用菜单锚显示弹出菜单
  11. Windows下DOS操作系统(cmd)详解
  12. 考研压力越来越大,你秃了吗?
  13. 欧洲商学院MBA(项目管理)学习笔记
  14. 怎么将自己的头像p到特定的背景图_做个背景透明的头像,让自己的微信与众不同...
  15. c++ notes (very basic)
  16. echarts折线图默认显示最后一个点的数据
  17. 再探JS---eval函数
  18. 新版经营级秀出打赏系统源码+带支付模块/视频教程
  19. 第六届高分子材料国际研讨会(PMS-BT 2019)
  20. MySQL BETWEEN 语法

热门文章

  1. 全局变量/static静态变量在section段中的分布
  2. MongoDB数据库的下载与Python交互
  3. 密码学基础知识(二)密码体制
  4. 【网络安全】2022年第一次靶场渗透实战学习
  5. 【内网渗透工具】炫彩蛇安装教程
  6. 渗透操作系统——【靶场实战训练营】快来看看有没有你需要的
  7. aliyun服务器安装git,g++
  8. 1.3 List集合:ArrayList和LinkedList类的用法及区别
  9. Codeforces Round #481 (Div. 3)【完结】
  10. 编写一个c程序的头文件