高亮显示UILabel中的子串

I. 用户在搜索框中,输入关键字进行检索时,APP对搜索结果进行显示,有以下两种情况:

1. 匹配一次,如检索关键字为人名

这种情况,实现比较容易。写一个UILabel的category, 用rangeOfString这个方法找到需要高亮的range, 最后设置attributedString便搞定。源码如下:

- (void)highlightString:(NSString *)str

{

if (self.text.length <= 0 || str.length <= 0) {

return;

}

NSString *scopeStr = self.text;

NSRange range = [scopeStr rangeOfString:str options:NSCaseInsensitiveSearch];

//color

NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:scopeStr];

[attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];

[self setAttributedText:attributedStr];

}

highlight的颜色可以改成你想要的任意色,我当前指定为蓝色。

或者你可以在此link下,查看源码。

2. 匹配次数为n次,一般此时检索结果为后台返回,如每日进行google search时,高亮显示所有匹配关键字(完全匹配关键字场景)

假定场景服务器返回子串类似于此:

eg: xxxx<em>xxxx</em>xxxxx<em>xxxx</em>xxxxx<em>xxxx</em>xxxxx   ---> originStr

起始标识: <em>  ---> beginTag

结束标识: </em> ---> endTag

目的:高亮在<em>和</em>中间部分的子串

中间关键变量定于:

1. tagArr: array of NSRange, 用于标识出originStr中所有成对出现的beginTag和endTag讯息

2. strArr: array of NSRange, 最终画在label上的string

3. colorArr: array of NSRange, 标识所有高亮位置

关键问题是:如何高效算出tagArr?

我目前做法是:从originStr的index=0开始成对找第一对的beginTag和endTag信息,然后将index赋值到第一个endTag的位置找第二对,以此类推。

具体源码大家查看此link,因为代码较多,不方便黏贴下来。这个功能实现是没有问题的,因为我在项目中便是用此方法实现的,但其存在优化空间。

II. highlight字符串基础上延伸至RichText

1. 类似于微信,在聊天对话框中显示表情

open source link : https://github.com/molon/MLEmojiLabel

我reveiw其源码出发点有两个:

  a. 如何找到所有表情位置?

  起初我想看看它用到什么算法,可以有助于我优化I.2中的问题。不过,此处用正则表达式来找到所有表情的位置信息的。

  查看MLEmojiLabel.m中此方法: - mutableAttributeStringWithEmojiText:

  ---> kSlashEmojiRegularExpression() ---> @"/:[\\x21-\\x2E\\x30-\\x7E]{1,8}" ---> 此正则表达式TBD(TO BE Discussed)?

  

  另: 表情与icon的对应,用plist进行存储。

  eg: key    : value

    /:eat  : Expression_b2 (icon‘s name)

  b. expression icon如何绘制到label上?

  查看MLEmojiLabel.m中此方法: - drawOtherForEndWithFrame:inRect: context: , 其中都是使用CoreText实现的。

2. TTTAttributedLabel for RichText

link : https://github.com/TTTAttributedLabel/TTTAttributedLabel

TTTAttributedLabel算是RichText比较常用的开源库了,MLEmojiLabel便是继承这个类的。它基本实现我们对富文本的一般操作,而不需要用到CoreText。比如:显示link,号码等等,以及对应的一些touch事件。可以用CoacoPods导入。顺便题外一下CoacoPods这个工具,用它检索好得ios开源项目,真心不错,因为这个平台已经帮我们过滤一遍了。

时间: 2024-10-30 21:31:05

高亮显示UILabel中的子串的相关文章

iOS7中计算UILabel中字符串的高度

iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UILabel+StringFrame.h ////  UILabel+StringFrame.h//  LabelHeight////  Copyright (c) 2014年 Y.X. All rights reserved.//#import <UIKit/UIKit.h>@interface UILabel (StringFrame)- 

字符串-02. 删除字符串中的子串(20)

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束的2个非空字符串,对应S1和S2. 输出格式: 在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串. 输入样例: Tomcat is a male ccatat cat 输出样例: Tom is a male import java.util.Scanner; public class Main { public static

在一个UILabel中实现不同的字体和颜色

关于如何在一个UILabel中实现不同字体和颜色的问题一直困扰了我很久,之前一直想着如何自定义一个UILabelView来实现,结果总是失败,知道最近我深入接触了NSMutableAttributedString之后,才发现要实现它原来是那么的简单. 遥想实现它,我们得换一种思路,那就是从要输入的字符串下手,而不是一味的从UILabel找突破.那好,一个例子就可以说明一切问题: NSString *title = @"Please rank from most to least the pers

spoj 694 求一个字符串中不同子串的个数

SPOJ Problem Set (classical) 694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number of its distinct substrings. Input T- number of test cases. T<=20; Each test case consists of one string, whose length is <=

传智播客视频学习 ----&gt;&gt;&gt;&gt; 项目开发模型_strstr_while模型(在 str 中查找子串 str2 的出现次数)

在 str 中查找子串 str2 的出现次数 // 参数:1->源字符串,2->查找的字符串,3->计数 int getStringCount(char *strSource, char *strFind, int *nCount) 第三个参数是查找的数量,可以返回查找多个str的数量,查找两个字符串的数量函数返回的是错误码 代码: 1 // 2 // atuo @silent 3 // date 2015/11/23 4 // 5 6 // 在一个字符串中查找另一个字符串出现的次数 7

C++ 在字符串中插入子串+推断字符串是否由空格组成

// Example3.cpp : 定义控制台应用程序的入口点. #include "StdAfx.h" #include <string> #include <iostream> using namespace std; int main(void) { string str,str1,str2; int index; //推断截取的子串是否由blanks组成 str=" cjc is a master."; str1="cjc

删除字符串中的子串

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2. 输入格式: 输入在2行中分别给出不超过80个字符长度的.以回车结束的2个非空字符串,对应S1和S2. 输出格式: 在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串. 输入样例: Tomcat is a male ccatat cat 输出样例: Tom is a male #include<stdio.h> #include<string.h> int main(){ cha

字符串中数字子串的求和

字符串中数字子串的求和 题目: 给定一个字符串str,求其中全部数字串所代表的数字之和. 要求: 1.忽略小数点字符,例如"A1.3",其中包含两个数字1和3. 2.如果紧贴数字子串的左侧出现字符'-',当连续出现次数为奇数时, 则数字视为负,连续出现的数量为偶数时,则数字视为正. 例如:"A-1BC--12",其中包含数字为-1和12. 例: str = "A1CD2E33" , 返回36 str = "A-1B--2C--D6E&q

08-在字符串中统计子串出现的次数

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace _05在字符串中统计子串出现的次数 { class Program { static void Main(string[] args) { int count = SubstringCount("qhwerzdfrefysasefh