iOS @功能的部分实现思路
需求描述
1. 发布信息时,通过键盘键入@符号,或者点选相关功能键,唤醒@列表,进行选择
2.选择结束后,输入栏改色显示相关内容
3.删除时,整体删除@区块,且不能让光标落在@区块之间
实现步骤
1. 键入@符号,触发相关功能
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
//判断键入的字符
if ([text isEqualToString:@"@"]) {
//触发相关功能
//[self pickRemaidBtnClick];
return NO;
}
return YES;
}
2. @区块颜色修改
(1)使用到的正则表达式
#define kATRegular @"@[\\u4e00-\\u9fa5\\w\\-\\_]+ "
(2)获取匹配到的区块下标数组
+ (NSArray *) getMatchsWithStr : (NSString *) text {
// 找到文本中所有的@
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kATRegular options:NSRegularExpressionCaseInsensitive error:nil];
NSArray *matches = [regex matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(, [text length])];
return matches;
}
(3)修改文本颜色
-(void)textViewDidChange:(UITextView *)textView {
NSArray *matchs = [RemaidUserUtils getMatchsWithStr:textView.text];
//改色
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#333333"] range:NSMakeRange(, textView.text.length)];
for (NSTextCheckingResult *match in matchs)
{
[textView.textStorage addAttribute:NSForegroundColorAttributeName value:BLUECOLOR range:NSMakeRange(match.range.location, match.range.length - )];
}
}
3.删除时整体删除@区块
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
if ([text isEqualToString:@""])
{
NSRange selectRange = textView.selectedRange;
if (selectRange.length > )
{
//用户长按选择文本时不处理
return YES;
}
// 判断删除的是一个@中间的字符就整体删除
NSMutableString *string = [NSMutableString stringWithString:textView.text];
NSArray *matches = [RemaidUserUtils getMatchsWithStr:string];
BOOL inAt = NO;
NSInteger index = range.location;
for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + , match.range.length - );
if (NSLocationInRange(range.location, newRange))
{
inAt = YES;
index = match.range.location;
[textView.textStorage replaceCharactersInRange:match.range withString:@""];
textView.selectedRange = NSMakeRange(index, );
[self textViewDidChange:textView];
return NO;
break;
}
}
}
return YES;
}
4.不允许光标落在@区块之间
- (void)textViewDidChangeSelection:(UITextView *)textView {
// 光标不能点落在@词中间
NSRange range = textView.selectedRange;
if (range.length > )
{
// 选择文本时可以
return;
}
NSArray *matches = [RemaidUserUtils getMatchsWithStr:textView.text];
for (NSTextCheckingResult *match in matches)
{
NSRange newRange = NSMakeRange(match.range.location + , match.range.length - );
if (NSLocationInRange(range.location, newRange))
{
if (range.location == match.range.location + ) {
textView.selectedRange = NSMakeRange(match.range.location + match.range.length, );
} else {
textView.selectedRange = NSMakeRange(match.range.location , );
}
break;
}
}
}
BY: chu
iOS @功能的部分实现思路的更多相关文章
- Unity iOS混合开发界面切换思路
Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...
- 多文件上传 iOS功能
多文件上传 iOS功能,原文来自ios教程网整理的,大家可以看看演示:ios.662p.com ,喜欢的朋友可以看看我的博客吧. NSURL* url = [NSURL URLWithString:@ ...
- 李洪强iOS开发-网络新闻获取数据思路回顾
李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据 1.1 定义类方法返回单例对 ...
- iOS 组件化 —— 路由设计思路分析
原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...
- 怎么样才是设计功能函数的好思路(javascript)?
在js里面,对于函数的调用,实际上也是也是面向对象的思路,于是写好js函数,也是考核面向对象设计的能力,同时也必须考虑到如何实现高内聚和低耦合,拿一个例子来说,现在的需求是这样的,实现个投资进度框,就 ...
- iOS逆向系列-逆向APP思路
界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...
- 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档
iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...
- 关于 iOS 刷新效果实现的思路 和 mac软件网址推荐
有一次面试,突然有个人问了我一个问题:MJRefresh的原理是什么? 我说这种效果可以有两种方法实现: 1. UIRefreshControl 2. 通过监听scrollview的偏移量,自定义 ...
- 实现ios常见菜单效果的思路
眼下见过的实现边側菜单的效果.比較流行的有下面三种:(效果图) 1.菜单条覆盖在部分主视图上 附上实现该效果的一个不错的源代码地址: http://code4app.com/ios/RNFrosted ...
随机推荐
- python 添加Windows权限
# -*- coding: utf-8 -*- """ Created on Mon Jan 8 09:09:51 2018 @author: coordinate &q ...
- rsync提权
介绍:Rsync是linux下一款数据备份工具,默认开启873端口 利用条件:rsync未授权 列出模板 rsync rsync://目标ip:873/ 列出模块src下的文件 rsync rsync ...
- 小a的学期 (组合数取模模板)
题目描述 小a是一个健忘的人,由于他经常忘记做作业,因此老师对他很恼火. 小a马上就要开学了,他学期一共2n 天,对于第i天,他有可能写了作业,也可能没写作业,不过他自己心里还有点B数,因此他会写恰好 ...
- ESP8266 tcp透传AP+STA
AP 建立WIFI,接受STA连接,串口数据和TCP互传 #include <ESP8266WiFi.h> const char *ssid = "esp8266_666&quo ...
- LeetCode 1105. Filling Bookcase Shelves
原题链接在这里:https://leetcode.com/problems/filling-bookcase-shelves/ 题目: We have a sequence of books: the ...
- 使用rrweb 进行web 操作录制以及回放
rrweb 是使用typescript 开发的web 操作录制以及回放框架,包含了比较完整的系统组件 rrweb-snapshot 进行dom 与操作实践的关联处理 rrweb 主要包含了record ...
- PHP.INI生成环境配置文件
extension_dir = /home/php/lib/php/extensions/no-debug-zts- zend_extension = opcache.so extension = p ...
- 回文数 js 解法
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- HTML5之图片在Retina屏的常用几种处理方式
Media Queries使用css3的媒体查询实现高清屏的图片处理. @media only screen and (-webkit-min-device-pixel-ratio: 1.5), on ...
- Eclipse Maven问题小记
Eclipse Maven Web工程报错:java.lang.ClassNotFoundException: ContextLoaderListener 原因:打包项目时没有把相关Maven依赖包打 ...