iOS - 修改 UITextField 的 clearButtton 样式
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 样式相关推荐
- iOS 修改搜索框的样式为白色
2019独角兽企业重金招聘Python工程师标准>>> //思路:正常SearchBar有一个灰色环绕边框,在searchBar外层加一个白色的背景,这个背景只够包围searchBa ...
- iOS 修改文字大小以适配lable高度宽度
iOS 修改文字大小以适配lable高度宽度 在开发中,我们也许会遇到根据文字多少动态修改lable的高度,但也有lable高度和宽度是固定的,这个时候如果想让文字显示完全,就必须修改文字字体大小.动 ...
- 【百度地图API1.1】修改文本标注的样式
原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...
- CSS/Compass修改placeholder的文字样式
在HTML5中,<input>与<textarea>标签支持placeholder属性,用来定义无任何输入时的默认文字. 可以通过CSS修改placeholder的文字样式: ...
- iOS 修改项目名称
2019独角兽企业重金招聘Python工程师标准>>> 1. [代码]iOS 修改项目名称 1 2. [图片] 1.png 3. [图片] 2.png 4. [图片] 3.png 5 ...
- zblog php 侧边栏样式,ZBlogPHP免费主题Blogs如何修改侧边栏搜索框样式?
老古偶尔访问有某些使用 ZBlogPHP 免费主题 Blogs 的站点,发现他们的侧边栏搜索框样式都比较丑,一看就知道这些站长都没有认真阅读Blogs 主题介绍页,因为介绍页中的第四大点侧边栏模块使用 ...
- [vue-element] ElementUI怎么修改组件的默认样式?
[vue-element] ElementUI怎么修改组件的默认样式? 方法一:/deep/ 方法二:>>> 方法三:在外层添加一层div,设置自定义类名,再修改里边的样式, 格式. ...
- IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容
IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容 UIAlertController *alertVC = [UIAlertController alertControl ...
- iOS 修改webView字体
五中方案 UIFont *font = [UIFont systemFontOfSize:12];//方法一NSString *fontColor =@"CCCCFF";NSStr ...
最新文章
- 创新工场2018年夏令营DeepCamp第一套解答笔记
- (Java)关于泛型
- java 多线程性能_Java中多线程的性能比较
- 六度分离(HDU-1869)
- Apache Cassandra和Apache Ignite:分布式数据库的明智之选
- PAT 乙级 1046. 划拳(15) Java版
- POJ 1703 Find them, Catch them 并查集
- ubuntu 搜狗输入法的安装
- sqlmap入门使用教程
- UE4官方文档UI学习:6. UMG 使用菜单锚显示弹出菜单
- Windows下DOS操作系统(cmd)详解
- 考研压力越来越大,你秃了吗?
- 欧洲商学院MBA(项目管理)学习笔记
- 怎么将自己的头像p到特定的背景图_做个背景透明的头像,让自己的微信与众不同...
- c++ notes (very basic)
- echarts折线图默认显示最后一个点的数据
- 再探JS---eval函数
- 新版经营级秀出打赏系统源码+带支付模块/视频教程
- 第六届高分子材料国际研讨会(PMS-BT 2019)
- MySQL BETWEEN 语法