项目中有一个需求就是实现一段文字中有几个特殊的字符可以有下划线,并且可以进行点击。

首先可以实现下划线效果,首先想到的是UILabel和UITextView控件的 NSMutableAttributedString 属性,考虑到可能会有点击事件效果的实现,这里选择UITextView控件,因为UITextView有一个功能就是能通过NSRange获得文字的相应的Frame。

最终实现这种效果,带下划线的可以点击,点击可以设置背景颜色,也可以不设置背景颜色,可以设置下换线以及下划线上面文字的颜色。

实现效果.png

1、首先创建UITextView类

创建UITextView.png

2、ClickTextView类中声明点击回调的block,这里回调用block进行回调

/** 点击回调的block */

typedef void(^clickTextViewPartBlock)(NSString *clickText);

3、介绍下主要的实现方法

1>、这个方法主要是将下划线对用的文字的frame,文字内容,点击效果背景颜色存储起来,以供点击的时候查询

/**

* 设置textView的部分为下划线,并且使之可以点击

*

* @param underlineTextRange 需要下划线的文字范围,如果NSRange范围超出总的内容,将过滤掉

* @param color 下划线的颜色,以及下划线上面文字的颜色

* @param coverColor 是否有点击的背景,如果设置相关颜色的话,将会有点击效果,如果为nil将没有点击效果

* @param block 点击文字的时候的回调

*/

- (void)setUnderlineTextWithRange:(NSRange)underlineTextRange withUnderlineColor:(UIColor *)color withClickCoverColor:(UIColor *)coverColor withBlock:(clickTextViewPartBlock)block

{

if (self.text.length < underlineTextRange.location+underlineTextRange.length) {

return;

}

// 设置下划线

[self.content addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:underlineTextRange];

//设置文字颜色

if (color) {

[self.content addAttribute:NSForegroundColorAttributeName value:color range:underlineTextRange];

}

self.attributedText = self.content;

// 设置下划线文字的点击事件

// self.selectedRange 影响 self.selectedTextRange

self.selectedRange = underlineTextRange;

// 获取选中范围内的矩形框

NSArray *selectionRects = [self selectionRectsForRange:self.selectedTextRange];

// 清空选中范围

self.selectedRange = NSMakeRange(0, 0);

// 可能会点击的范围的数组

NSMutableArray *selectedArray = [[NSMutableArray alloc] init];

for (UITextSelectionRect *selectionRect in selectionRects) {

CGRect rect = selectionRect.rect;

if (rect.size.width == 0 || rect.size.height == 0) {

continue;

}

// 将有用的信息打包存储到数组中

NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

// 存储文字对应的frame,一段文字可能会有两个甚至多个frame,考虑到文字换行问题

[dic setObject:[NSValue valueWithCGRect:rect] forKey:@"rect"];

// 存储下划线对应的文字

[dic setObject:[self.text substringWithRange:underlineTextRange] forKey:@"content"];

// 存储相应的回调的block

[dic setObject:block forKey:@"block"];

// 存储对应的点击效果背景颜色

[dic setValue:coverColor forKey:@"coverColor"];

[selectedArray addObject:dic];

}

// 将可能点击的范围的数组存储到总的数组中

[self.rectsArray addObject:selectedArray];

}

2>、通过一个点击的点,去查找有没有点在下划线对用的文字范围内,并且返回之前打包的数据模型

- (NSArray *)touchingSpecialWithPoint:(CGPoint)point

{

// 从所有的特殊的范围中找到点击的那个点

for (NSArray *selecedArray in self.rectsArray) {

for (NSDictionary *dic in selecedArray) {

CGRect myRect = [dic[@"rect"] CGRectValue];

if(CGRectContainsPoint(myRect, point) ){

return selecedArray;

}

}

}

return nil;

}

3>、通过touchesBegan的方法,获取点击的点,并且去查询相关数据模型,并且根据参数是不是展示相应的点击效果,并且通过blcok进行回调

// 点击textView的 touchesBegan 方法

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

// 获取触摸对象

UITouch *touch = [touches anyObject];

// 触摸点

CGPoint point = [touch locationInView:self];

// 通过一个触摸点,查询点击的是不是在下划线对应的文字的frame

NSArray *selectedArray = [self touchingSpecialWithPoint:point];

for (NSDictionary *dic in selectedArray) {

if(dic && dic[@"coverColor"]){

UIView *cover = [[UIView alloc] init];

cover.backgroundColor = dic[@"coverColor"];

cover.frame = [dic[@"rect"] CGRectValue];

cover.layer.cornerRadius = 5;

cover.tag = kCoverViewTag;

[self insertSubview:cover atIndex:0];

}

}

if (selectedArray.count) {

// 如果说有点击效果的话,加个延时,展示下点击效果,如果没有点击效果的话,直接回调

NSDictionary *dic = [selectedArray firstObject];

clickTextViewPartBlock block = dic[@"block"];

if (dic[@"coverColor"]) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

block(dic[@"content"]);

});

}else{

block(dic[@"content"]);

}

}

}

4>、点击结束的时候取消点击效果,也就是删除点击的时候创建的view

/** 点击结束的时候 */

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

for (UIView *subView in self.subviews) {

if (subView.tag == kCoverViewTag) {

[subView removeFromSuperview];

}

}

});

}

/**

* 取消点击的时候,清除相关的阴影

*/

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

for (UIView *subView in self.subviews) {

if (subView.tag == kCoverViewTag) {

[subView removeFromSuperview];

}

}

}

5、在ViewController中进行测试

ClickTextView *clickTextView = [[ClickTextView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];

[self.view addSubview:clickTextView];

// 方便测试,设置textView的边框已经背景

clickTextView.backgroundColor = [UIColor cyanColor];

clickTextView.layer.borderWidth = 1;

clickTextView.layer.borderColor = [UIColor redColor].CGColor;

clickTextView.font = [UIFont systemFontOfSize:30];

//clickTextView.textColor = [UIColor redColor];

NSString *content = @"1234567890承诺书都差不多岁尺布斗粟CBD死UC收不到催上半场低俗";

// 设置文字

clickTextView.text = content;

// 设置期中的一段文字有下划线,下划线的颜色为蓝色,点击下划线文字有相关的点击效果

NSRange range1 = [content rangeOfString:@"承诺书都差"];

[clickTextView setUnderlineTextWithRange:range1 withUnderlineColor:[UIColor blueColor] withClickCoverColor:[UIColor greenColor] withBlock:^(NSString *clickText) {

NSLog(@"clickText = %@",clickText);

}];

// 设置期中的一段文字有下划线,下划线的颜色没有设置,点击下划线文字没有点击效果

NSRange range2 = [content rangeOfString:@"不到催上半场低俗"];

[clickTextView setUnderlineTextWithRange:range2 withUnderlineColor:nil withClickCoverColor:nil withBlock:^(NSString *clickText) {

NSLog(@"clickText = %@",clickText);

}];

如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。

详情Demo可参考

ios 按钮文字下划线_iOS实现一段文字中部分有下划线,并且可以点击相关推荐

  1. Mac下eclipse的Hadoop开发环境配置中以及windows->preferences下看不到Hadoop/MapReduce的配置项问题解决

    Mac下eclipse的Hadoop开发环境配置中以及windows->preferences下看不到Hadoop/MapReduce的配置项问题解决 1. 下载hadoop插件 下载好hado ...

  2. iostext添加点击事件_iOS实现一段文字中指定的某些文字点击有响应事件或者可以跳转(给字符串添加超链接)...

    直接上需求,见如下UI图: 需求是点击中间的电话(蓝色字体部分),可以直接拨打电话.对于这种很长的一段文字中间夹着可以有点击事件的文字,可以通过下面这种方式解决: 图中所指的这段文字,不用UILabe ...

  3. html5文字开始空两格,一段文字的开头为什么要空两格

    有一个简书作者,名叫上官皖又名官皖儿,是中国著名新闻人(总编辑),他刚才点赞我文,我打开他的主页阅读他的文章,其中有一篇讲到,学生试卷分数下边两条杠究竟是怎么来的. 图片发自简书App 这是生活里一个 ...

  4. 下拉选择_在管理Excel中实现联动下拉选择

    在系统中常常出现这样的情况:由于下拉选择的数量太多了,难以高效选择.为此管理Excel通过通过引入多级联动选择的方式来减少下拉选择的困难度.先看下使用效果: 联动下拉选择 这个功能,在管理Excel中 ...

  5. excel添加列下拉框票价_excel表格下拉表格添加数据-excel2017表格中怎么制作下拉菜单列表框...

    在Excel表中,如何将增加下拉菜单的选项? excel中的下拉菜单选项,就是筛选的功能,具体操作如下: 1.首先选中a.b两列数据,在"开始"选项卡上选择"筛选&quo ...

  6. autolink android不显示下划线,Android开发技巧——去掉TextView中autolink的下划线

    我们知道,在布局文件中设置textview的autolink及其类型,这时textivew上会显示link的颜色,并且文字下面会有一条下划线,表示可以点击.而在我们在点击textview时,应用将根据 ...

  7. mysql把一个字段加到另一张表中_mysql如何能把一个表中的某一字段下的数据加入另一个表中相同字段下,条件是两表中的某字段相同?...

    1.创建表 create table a (name varchar(20) not null,sex varchar(10)); create table b (name varchar(20) n ...

  8. 开发一个出生年份的下拉选择框供用户选择_你的下拉式菜单设计对了吗?

    追波范儿(dribbbledesign)------------------------------------------- 下拉菜单主要有两种类型:1. 用于导航的下拉菜单:2. 用于表单的下拉菜 ...

  9. ios 按钮文字下划线_iOS - UIButton设置文字标题下划线以及下划线颜色

    创建button设置可以折行显示 - (void)viewDidLoad { [super viewDidLoad]; UIButton * button = [[UIButton alloc] in ...

最新文章

  1. 抽象类、抽象方法与代码块
  2. 龙芯3A5000初样顺利交付流片
  3. 第三届“信息论与编码”中大论坛诚邀您的参加
  4. Python Cookbook 资料链接
  5. 2018.08.22 NOIP模拟 string(模拟)
  6. 行翻转和列翻转_用量子计算机翻转硬币
  7. WINDOWSXP主题风格美化教程
  8. 逻辑谬误_新网络谬误
  9. Z05 - 004、网站流量多维度细分(流量分析)
  10. matlab中peaks是什么,Matlab中的peaks函数.doc
  11. 大一作业:c语言,用static变量编写一个函数fac(int n),此函数连续调用n次,可以依次返回1至n的阶乘值。最后用main调用fac函数输出1-5的阶乘。
  12. ZooZ推出应用内移动支付SDK
  13. python随机生成一个数字_如何实现python随机生成数字?
  14. ascll编码表图片_ASCll码 表
  15. 人工智能专家系统c语言,人工智能实验4三-专家系统.doc
  16. 华为C8815 默认logcat信息
  17. 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序
  18. 爬取动漫美女,手把手教你用Python网络爬虫获取动漫图片
  19. 把握云计算+引领云时代
  20. 用100nf的电容滤除72MHz正弦波信号,合适么?

热门文章

  1. 怎么在微信小程序中设置密码重置
  2. 基于 STM32对音频数据的 Flash 读取与 DAC 播放
  3. 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)
  4. python抢购茅台抢购描述
  5. python 计算银行带宽等额本金和等额本息的方法
  6. 《如何阅读一本书》做一名“棒球赛中的捕手”
  7. pytorch——梯度计算
  8. 佛山市政携手企企通,打造高效协同的云端极速供应链
  9. 中小企业筹资新法:应收账款也可质押融资
  10. 获取硬件序列号(注册机)