最近在项目开发中遇到了设置多行文本,点击蓝色邮箱部分跳转到发邮件页面功能。当然比较简单的方式是多标签单独设置,那样稍显麻烦。我们能不能用一个控件,给某一部分添加点击事件,结果是可以的,UITextView完美实现这个功能,代码如下。

  1、添加UITextView的代理UITextViewDelegate

  2、@property (nonatomic, strong) UITextView *textRemind;//设置UITextView属性变量

  

- (UITextView *)textRemind{

if (_textRemind == nil) {

_textRemind = [[UITextView alloc]init];

_textRemind.backgroundColor = [UIColor greenColor];

_textRemind.textColor=K_CC_COLOR_STRING(@"#999999");

//_textRemind.textAlignment = NSTextAlignmentRight;//此处没有效果,需要在属性里面单独设置

_textRemind.font = K_CC_FONT_SEMIBOLD(14);

}

return _textRemind;

}

//顶部菜单标题

NSString *firstStr=@"此功能暂时无法使用,请联系\n";

NSString *secondStr=@"guanshuai@cloudcc.com\n";

NSString *thirdStr=@"或\n";

NSString *fourthStr=@"rjr@cloudcc.com\n";

NSString *fifthStr=@"开通";

NSString *remindStr=[NSString stringWithFormat:@"%@%@%@%@%@",firstStr,secondStr,thirdStr,fourthStr,fifthStr];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:remindStr];

//给需要点击的部分添加关键字

[attributedString addAttribute:NSLinkAttributeName

value:@"firstmanager"

range:[[attributedString string] rangeOfString:secondStr]];

[attributedString addAttribute:NSLinkAttributeName

value:@"secondmanager"

range:[[attributedString string] rangeOfString:fourthStr]];

//设置水平中间对齐

NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];

[paragrahStyle setAlignment:NSTextAlignmentCenter];

[attributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:NSMakeRange(0, remindStr.length)];

self.textRemind.attributedText = attributedString;

//设置点击部分的文字颜色

self.textRemind.linkTextAttributes = @{NSForegroundColorAttributeName: K_CC_COLOR_STRING(@"#2D6CFC") };

self.textRemind.editable = NO;        //必须禁止输入,否则点击将弹出输入键盘

self.textRemind.scrollEnabled = NO;

self.textRemind.selectable = NO;

self.textRemind.delegate = self;

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addGestureRecognizer:)];

[self.textRemind addGestureRecognizer:tapRecognizer];

[self.view addSubview:self.textRemind];

[self.textRemind mas_makeConstraints:^(MASConstraintMaker *make) {

make.center.equalTo(self.view);

make.height.mas_equalTo(100);

make.width.mas_equalTo(K_CC_SCREEN_WIDTH-32);

}];

3、添加手势处理

-(void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer{

if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]])

{

CGPoint tapLocation = [gestureRecognizer locationInView:self.textRemind];

UITextPosition *textPosition = [self.textRemind closestPositionToPoint:tapLocation];

NSDictionary *attributes = [self.textRemind textStylingAtPosition:textPosition inDirection:UITextStorageDirectionBackward];

NSURL *url = attributes[NSLinkAttributeName];

if(url) {

NSRange range = [self.textRemind.text rangeOfString:@"guanshuai@cloudcc.com\n"];

if (([url isKindOfClass:[NSString class]] && [(NSString *)url isEqualToString:@"firstmanager"])) {

range = [self.textRemind.text rangeOfString:@"guanshuai@cloudcc.com\n"];

} else if(([url isKindOfClass:[NSString class]] && [(NSString *)url isEqualToString:@"secondmanager"])){

range = [self.textRemind.text rangeOfString:@"rjr@cloudcc.com\n"];

}

[self  textView:self.textRemind shouldInteractWithURL:url inRange:range];

}

}

}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{

if ([(NSString *)URL isEqualToString:@"firstmanager"]) {

return NO;

} else if ([(NSString *)URL isEqualToString:@"secondmanager"]) {

return NO;

}

return YES;

}

iOS中使用UITextView设置不同文本部分点击事件小结的更多相关文章

  1. iOS全埋点解决方案-UITableView和UICollectionView点击事件

    前言 在 $AppClick 事件采集中,还有两个比较特殊的控件: UITableView •UICollectionView 这两个控件的点击事件,一般指的是点击 UITableViewCell 和 ...

  2. 苹果手机IOS中div contenteditable=true 仿文本域无法输入编辑

    问题: 在苹果手机IOS中 contenteditable="true" 做文本域输入,点击可以弹出键盘但是无法输入,安卓都正常. 经测试后,记得加一个样式 -webkit-use ...

  3. iOS中UITextField常用设置和方法

    //初始化textField并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )]; // ...

  4. 设置队列中文件上的“X”号的点击事件+uploadLimit动态加1

    目的:1.设置文件队列中“x”号的点击事件 2.每次删除服务器文件后,把uploadLimit + 1: 'onUploadSuccess': function (file, data, respon ...

  5. YYLabel 自动布局 富文本文字点击事件

    YYLabel显示多行除了需要设置numberOfLines = 0以外,还需要设置preferredMaxLayoutWidth最大的宽度值才可以生效多行效果 YYLabel中的NSMutableA ...

  6. clickableSpan实现textView文字部分点击有响应

    先定义一个clickableSpan的子类 class MyClickText extends ClickableSpan{ private Context context; public MyCli ...

  7. iOS开发 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突

    该篇文章摘自我的新浪博客,原文地址为: http://blog.sina.com.cn/s/blog_dcc636350102wavx.html UITableView 拥有属于自己的点击事件,在将一 ...

  8. swiper在vue项目中的循环轮播bug以及点击事件

    一般的,如果是静态数据(本地数据),可以直接在mounted生命周期中初始化,循环轮播.自动播放都比较正常. 但是,如果是动态从后台获取数据的话,采用上述方法会发现,轮播图无法自动播放,也无法拖拽. ...

  9. Winform中使用代码编写Button按钮的点击事件

    场景 一般在进行Winform窗体开发时都会拖拽一个Button,然后双击进入Button按钮的点击事件中,进行 点击事件的编写. 如果窗体上事先没有Button按钮,是在代码中生成的Button按钮 ...

  10. ios中自定义cell 设置cell的分组结构

    ios系统默认的cell并不能满足我们的需求 这个时候就需要自定义我们的cell 自定义cell为分组的时候 需要设置分组样式  以下是我常用分组的二种方法: 第一是 在自定义的UITableView ...

随机推荐

  1. python yield关键字作用

    python yield关键字作用 1,是当前对象变成一个可迭代对象 def frange(start,stop,step): x = start while x<stop: yield x x ...

  2. 【CentOS】tar包安装Tomcat

    下载Linux版本的Tomcat[Tar包] 上传到Linux 解压Tar包 tar -zxvf apache-tomcat-8.5.55.tar.gz 目录重命名简化名称[可不做] mv apach ...

  3. 【Vue】Re09 Webpack 第一部分(介绍、安装、配置)

    一.Webpack的用途 webpack要解决的是统一网页资源的问题 前端工程化出现了很多问题,就是兼容性,浏览器所不能解析 所以需要一个打包,转换等方式处理 二.安装描述介绍 下载安装NodeJS, ...

  4. 使用python对Excel表格某个区域保存为图片

    实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路. python操作e ...

  5. 什么是3D扫描技术?

    相关: https://www.bilibili.com/video/BV1fN4y1z7uD/?vd_source=f1d0f27367a99104c397918f0cf362b7 接触式:就是使用 ...

  6. 调用lcd屏输出德国国旗

    /************************************************* * * file name:color.c * author :momolyl@126.com * ...

  7. 让你的C程序,可以自动更新版本信息

    一.软件管理 稍微上点规模的软件开发往往周期都非常长, 中间会产生很多临时版本, 这些临时版本往往会有各种各样的bug, 由于项目参与的人员众多.水平参差不齐, 软件分支众多.功能复杂, 经常会有各种 ...

  8. JavaScript设计模式样例十七 —— 迭代器模式

    迭代器模式(Itrator Pattern) 定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示.目的:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示.场景:$ ...

  9. Terraform中的for_each和count

    通过Terraform创建云主机时,在某些业务场景下,一个机器需要挂载多个云盘,一般云厂商都是单独创建云主机和云硬盘然后通过attachment的资源去挂载,因此我们的模板大致如下: resource ...

  10. TwinCAT3 - 实现自己的Dictionary

    目录 1,前言 2,C#的字典 3,TwinCAT3的字典 定义功能块 添加方法 4,用起来 1,前言 C#有字典,TwinCAT没字典,咋办,自己写一个咯 2,C#的字典 C#的字典使用很简单,下面 ...