1. 程式人生 > >iOS- 富文字

iOS- 富文字

iOS開發中經常會遇到一些圖文混排的情況,特別是在微博類應用的開發過程中經常會遇到各種表情,各種連結的解析。筆者在實踐開發中經歷了幾次這種型別的開發,由最開始的利用WebView進行佈局到最後利用富文字進行佈局,對該部分的開發積累了一定的經驗,現對富文字與正則表示式混用實現圖文混排進行總結:

一.富文字

     WebView雖然也可以實現圖文混排的效果,但是在使用的時候比較複雜,而且WebVIew的記憶體洩漏相當明顯,使用不好反而得補償失。現在很多的新聞類App都採用自己寫的富文字進行圖文混排。在很多情況下,富文字表現予外的是一個Label,將要顯示的內容通過正則等封裝成HTML字串,然後顯示在介面上,

下面就是按照步驟實現這一功能:

(1)先下載已經封裝好的富文字標籤類RCLabel(http://www.okbase.net/file/item/20694)

    該類是由一牛人封裝好的用於實現圖文混排的富文字類,在下載下來的原始碼中可以看到其用法,但是這裡有一個較為複雜的問題是你每次都需要手動將你要顯示的內容封裝成HTML格式的文字,這個過程相當繁瑣而且容易出錯,所以我在這個基礎上進行了改進,將封裝HTML的方法通過正則表示式獨立開來,這樣就實現了RCLabel與正則實現圖文混排,以下是程式碼:

     將字串轉化成HTML的正則如下:

     .h標頭檔案

  1.  #import 
    <Foundation/Foundation.h>
  2. @interface HtmlString : NSString  
  3. + (NSString *)transformString:(NSString *)originalStr;  
  4. @end  

     .m檔案

  1.  #import "HtmlString.h"  
  2. #import <Foundation/NSObjCRuntime.h>
  3. #import "RegexKitLite.h"  
  4. @implementation HtmlString  
  5. + (NSString *)transformString:(NSString *)originalStr  
  6. {  
  7.     NSString *text = originalStr;  
  8.     //解析http://短連結  
  9.     NSString *regex_http [email protected]"http(s)?://([a-zA-Z|\\d]+\\.)+[a-zA-Z|\\d]+(/[a-zA-Z|\\d|\\-|\\+|_./?%&=]*)?";//http://短連結正則表示式  
  10.     NSArray *array_http = [text componentsMatchedByRegex:regex_http];  
  11.     if ([array_http count]) {  
  12.         for (NSString *strin array_http) {  
  13.             NSRange range = [text rangeOfString:str];  
  14.             NSString *funUrlStr = [NSStringstringWithFormat:@"<ahref=%@>%@</a>",str, str];  
  15.             text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, str.length)withString:funUrlStr];  
  16.         }  
  17.     }  
  18.     //解析@  
  19.     NSString *regex_at [email protected]"@[\\u4e00-\\u9fa5\\w\\-]+";//@的正則表示式  
  20.     NSArray *array_at = [text componentsMatchedByRegex:regex_at];  
  21.     if ([array_at count]) {  
  22.         NSMutableArray *test_arr = [[NSMutableArrayalloc]init];  
  23.         for (NSString *strin array_at) {  
  24.             NSRange range = [text rangeOfString:str];  
  25.             if (![test_arr containsObject:str]) {  
  26.                 [test_arr addObject:str];  
  27.                 NSString *funUrlStr = [NSStringstringWithFormat:@"<ahref=%@>%@</a>",str, str];  
  28.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:funUrlStr];  
  29.             }  
  30.         }  
  31.         [test_arr release];  
  32.     }  
  33.     //解析&  
  34.     NSString *regex_dot [email protected]"\\$\\*?[\u4e00-\u9fa5|a-zA-Z|\\d]{2,8}(\\((SH|SZ)?\\d+\\))?";//&的正則表示式  
  35.     NSArray *array_dot = [text componentsMatchedByRegex:regex_dot];  
  36.     if ([array_dot count]) {  
  37.         NSMutableArray *test_arr = [[NSMutableArrayalloc]init];  
  38.         for (NSString *strin array_dot) {  
  39.             NSRange range = [text rangeOfString:str];  
  40.             if (![test_arr containsObject:str]) {  
  41.                 [test_arr addObject:str];  
  42.                 NSString *funUrlStr = [NSStringstringWithFormat:@"<ahref=%@>%@</a>",str, str];  
  43.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:funUrlStr];  
  44.             }  
  45.         }  
  46.         [test_arr release];  
  47.     }  
  48.     //解析話題  
  49.     NSString *regex_pound = @"#([^\\#|.]+)#";//話題的正則表示式  
  50.     NSArray *array_pound = [text componentsMatchedByRegex:regex_pound];  
  51.     if ([array_pound count]) {  
  52.         for (NSString *strin array_pound) {  
  53.             NSRange range = [text rangeOfString:str];  
  54.             NSString *funUrlStr = [NSStringstringWithFormat:@"<ahref=%@>%@</a>",str, str];  
  55.             text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [strlength])withString:funUrlStr];  
  56.         }  
  57.     }  
  58.     //解析表情  
  59.     NSString *regex_emoji [email protected]"\ [azAZ09u4e00u9fa5]+ ";//表情的正則表示式  
  60.     NSArray *array_emoji = [text componentsMatchedByRegex:regex_emoji];  
  61.     NSString *filePath = [[[NSBundlemainBundle]resourcePath]stringByAppendingPathComponent:@"emotionImage.plist"];  
  62.     NSDictionary *m_EmojiDic = [[NSDictionaryalloc]initWithContentsOfFile:filePath];  
  63.    // NSString *path = [NSString stringWithFormat:@"%@", [[NSBundle mainBundle] bundlePath]];  
  64.     if ([array_emoji count]) {  
  65.         for (NSString *strin array_emoji) {  
  66.             NSRange range = [text rangeOfString:str];  
  67.             NSString *i_transCharacter = [m_EmojiDicobjectForKey:str];  
  68.             if (i_transCharacter) {  
  69.                 //NSString *imageHtml = [NSString stringWithFormat:@"<imgsrc = 'file://%@/%@'width='12'height='12'>", path, i_transCharacter];  
  70.                 NSString *imageHtml = [NSStringstringWithFormat:@"<imgsrc =%@>",  i_transCharacter];  
  71.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:[imageHtmlstringByAppendingString:@" "]];  
  72.             }  
  73.         }  
  74.     }  
  75.     [m_EmojiDic release];  
  76.     //返回轉義後的字串  
  77.     return text;  
  78. }  
  79. @end  

    實用的時候:
  1.    //contentStr為你要顯示的圖文字串  
  2.    NSString *str = [HtmlStringtransformString:contentStr];  
  3.     textLabel = [[RCLabelalloc]initWithFrame:CGRectMake(10,160,300,84)];  
  4.     textLabel.delegate =self;  
  5.     textLabel.sizeDelegate =self;  
  6.     [textLabelsetFont:[UIFontfontWithName:TextNamesize:15]];  
  7.     RCLabelComponentsStructure *componentsDS = [RCLabelextractTextStyle:textString];  
  8.     textLabel.componentsAndPlainText = componentsDS;  
  9.     CGSize optimalSize = [textLabeloptimumSize:YES];   //計算圖文混排後的高度  
  10.     textLabel.frame=CGRectMake(10,180,300, optimalSize.height+5);  
  11.     textLabel.lineBreakMode =NSLineBreakByCharWrapping;  
  12.     textLabel.backgroundColor = [UIColorclearColor];  
  13.     textLabel.textColor = [UIColorcolorWithRed:33.0/255green:33.0/255blue:33.0/255alpha:1];  
  14.     [self.viewaddSubview:textLabel];  
  15.    //如果你在實現圖文混排時還有超連結、@、$等,在最後實現該類的代理方法  
  16. -(void)RCLabel:(id)RCLabel didSelectLinkWithURL:(NSString *)url  
  17. {   //url為超連結的文字內容  
  18. }   

效果圖:

原文出處:http://blog.csdn.net/javayujiafeng/article/details/14163319

相關推薦

ios 文字的高度

+ (CGFloat)getStrHeightWithAttributeStr:(NSAttributedString *)string viewWidth:(CGFloat)viewWidth{ if (string.

iOS文字(NSAttributedString)---盡力弄全了

專案上要載入html格式的文字,學習一下富文字相關內容。 1.載入HTML標籤文字 因為解析的資料裡面有html標籤,就使用下面的程式碼把字串轉換成data,初始化時再用HTML型別,轉換為富文字。 NSMutableAttributedString * at

iOS文字手動重新整理和非同步替換網路圖片

CSDN註冊好幾年一直沒用過於是乎今天心血來潮寫一篇技術交流貼,以供有需要的道友。 移動端iOS開發中,少不了遇到NSAttributedString(富文字字典集合)富文字形式進行圖文混排。如果想替換富文字內部某個位置的圖片,有一種方式是找到range,然後重新生成此

iOS文字編輯(在label裡顯示文字和圖片)

在開始寫之前先看一下效果圖 在此效果圖中有富文字中指定的位置新增圖片,還有最後位置新增的圖片資訊 程式碼如下 呼叫方法------- 給label賦值 NSString * Str = @"中國人民解放軍萬歲,中華人民共和國萬歲,萬歲!"; sel

iOS 文字、圖文混排

#import "testView.h" #import <CoreText/CoreText.h> @implementation testView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWit

蘋果開發 筆記(89)第三方 iOS 文字元件

今天看到個不錯的開源庫,據說是一名人人網的ios 作者維護的庫,看了一下相當厲害。第三方庫對處理富文字相當給力了。 尷尬的是,自己還沒能看懂這些底層實用的原理。 只能先記錄一下

iOS 文字風格NSMutableParagraphStyle、定製UITextView插入圖片和定製複製

問題一開發過程中,經常會遇到動態計算行高的問題,  - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullableNSD

iOS 文字label字型大小和顏色

實現:最初實現的時候想到了用兩個Label,來實現,第一個顯示¥4000,設定一個字型,第二個顯示/月,設定另一個字型.這樣就能實現這個效果了,但是最後想一想還是用富文字比較好,順便可以學習一下. //先建立一個label: -(UILabel *)pri

iOS 文字如何新增圖片

//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄                        QQ群:807236138  群稱:iOS 技術交流學習群 一、概念     1.新增圖片效果圖     2.富文字新增圖片程式碼     3.富文字總結

iOS文字設定樣式,插入圖片,設定指定文字的點選事件

富文字:NSMutableAttributedString 它與普通文字之間最大的區別是可以設定不同欄位範圍的字型,顏色, 大小,樣式等. 字型大小 NSMutableAttributedString *attributed = [[NSMutableAttribut

iOS 文字 文字分別設定 文字屬性 Attributes 文字樣式 程式開發 效果圖

iOS 富文字 文字分別設定 文字屬性 Attributes 文字樣式 想要做自己的效果,那就把下邊的字典組合,字典組合要是不會,我幫不了你了 // 建一個小文字用來測試 UILab

iOS- 文字

在iOS開發中經常會遇到一些圖文混排的情況,特別是在微博類應用的開發過程中經常會遇到各種表情,各種連結的解析。筆者在實踐開發中經歷了幾次這種型別的開發,由最開始的利用WebView進行佈局到最後利用富文字進行佈局,對該部分的開發積累了一定的經驗,現對富文字與正則表示式混用

iOS開發之UILabel(文字)

1、常見的屬性及說明 NSFontAttributeName //字型 NSParagraphStyleAttributeName //段落格式 NSForegroundColorAttributeName //字型顏色 NSBackgroundColorAttributeN

ios HTML文字設定圖片大小

iOS中設定HTML富文字是,圖片太大顯示不全,這個時候需要修改CSS樣式,。 NSString *contentStr = [NSString stringWithFormat:@"<head><style>img{width:%f !important;he

iOS-[NSAttributedString]設定文字和計算文字高度

/** * 設定段落樣式 * * @param lineSpacing 行高 * @param textcolor 字型顏色 * @param font 字型 * * @return 富文字 */ -(NSAttributedString *)stringWithP

iOS之UI--文字總結

文章內容大綱 1、NSMutableAttributedString的基本使用 2、NSMutableAttributedString的簡易封裝 3、使用開原始碼GOBMarkupPaser處理富文字 4、UITextKit簡介 5、程式設計思想的相關思考 前言 富文字使用案例:

iOS swift 文字內容顯示

專案中很多地方都會用到富文字的內容:比如一般的商品詳情,視訊詳情,資訊詳情等,運營人員通過後臺的富文字編輯器編輯的內容,前端拿到的就是一段富文字的程式碼,這富文字大多都是圖片和文字的組合。我們今天介紹的RichTextView就是一個用來載入富文字的檢視 富文字要顯示出來可以使用NSAttributedSt

iOS NSMutableAttributedString 實現文字(不同顏色字型、下劃線等)

//    1> NSFontAttributeName(字型) //    該屬性所對應的值是一個 UIFont 物件。該屬性用於改變一段文字的字型。如果不指定該屬性,則預設為12-point Helvetica(Neue)。 //     //    2> NSParagraphSt

iOS通過html模版實現文字編輯

 在iOS開發中,常常會遇到一些富文字編輯,如新聞,公告等,NSMutableAttributedString又有一定的侷限性,所以我想到用html 模版去載入富文字頁面,根據所需要的格式,去構建相應的html介面。一個簡單的html模版如下: <!DOCTYP

iOS WKwebview 圖片適應螢幕,控制圖片寬度 . 文字

XML程式碼拼接一段下面程式碼: 其中htmlString為你要拼接的html NSString *htmls = [NSString stringWithFormat:@"<html> \n"