Share several commonly used property strings nsatrributestring and NSString Ordinary string conversion methods:
One: Replace the normal string with the property string containing the picture
plist file, picture format see:
+ (nsmutableattributedstring *) stringtoattributestring: (NSString *) text{ //First convert normal string text to generate attributed type string nsmutableattributedstring * attstr = [[nsmutableattributedstring alloc]initwithstring:text]; NSString * Zhengze = @ "\\[[a-za-z0-9\\u4e00-\\u9fa5]+\\]"; Regular expressions, such as [hehe] This form of wildcard character Nserror * ERROR;
<span style= "font-family:arial, Helvetica, Sans-serif;" > nsregularexpression * re = [nsregularexpression regularexpressionwithpattern:zhengze options: Nsregularexpressioncaseinsensitive error:&error];//Regular expression </span>
if (!re) {NSLog (@ "%@", [Error localizeddescription]);//Print Error} Nsarray * arr = [Re matchesinstring: Text options:0 range:nsmakerange (0, Text.length)];//traverse the string to get all the matching strings nsbundle *bundle = [NSBundle mainbundle]; NSString * Path = [bundle pathforresource:@ "Emotions" oftype:@ "plist"]; plist file, make an array containing text, emoji image name nsarray * face = [[Nsarray Alloc]initwithcontentsoffile:path]; Get all arrays//If there are multiple emoticons, it must be replaced from the back, since the range is inaccurate for (int j = (int) arr.count-1; j >= 0; j--) {//nstex Tcheckingresult contains range Nstextcheckingresult * result = Arr[j]; for (int i = 0; i < Face.count; i++) {if ([[[Text SubstringWithRange:result.range] isequaltostring:face[i][@ "CHS"])//From the dictionary in the array to take the element {NSString * imageName = [nsstring stringwithstring:face[i][@ "PNG"]]; Nstextattachment * textattachment = [[nstextattachment alloc]init];//add attachment, picture Textattachment.image = [UIImage imagenamed:imagename]; nsattributedstring * Imagestr = [nsattributedstring attributedstringwithattachment:textattachment]; [Attstr replaceCharactersInRange:result.range withattributedstring:imagestr];//Replace picture attachment Break }}} return attstr;}
Two: Gets the size of the property string:
Note: For property strings that contain text and pictures, you need to adjust their size according to the actual situation.
+ (Cgsize) getattributedtextsize: (NSString *) text{//First convert normal string text to generate attributed type of string nsmutableattributedstring * att STR = [[nsmutableattributedstring alloc]initwithstring:text]; NSString * Zhengze = @ "\\[[a-za-z0-9\\u4e00-\\u9fa5]+\\]"; Nserror * ERROR; Nsregularexpression * re = [nsregularexpression regularexpressionwithpattern:zhengze options: Nsregularexpressioncaseinsensitive error:&error]; if (!re) {NSLog (@ "Regular expression matches error%@", [Error localizeddescription]); } Nsarray * arr = [Re matchesinstring:text options:0 range:nsmakerange (0, text.length)]; if (!arr.count)//Description string does not have expression wildcard, is plain text, then calculate text size {nsdictionary *[email protected]{nsfontattributename: [UIF Ont systemfontofsize:14]}; Cgsize size1=[text Boundingrectwithsize:cgsizemake (+) Options:nsstringdrawinguseslinefragmentorigin Attributes:dic context:nil].size; if (size1.height<=60) {size1.height=60; } else {size1.height+=15; } return size1; } nsbundle *bundle = [NSBundle mainbundle]; NSString * Path = [bundle pathforresource:@ "Emotions" oftype:@ "plist"]; Nsarray * face = [[Nsarray Alloc]initwithcontentsoffile:path]; If you have more than one emoticon, you must replace it from the back, since the range is inaccurate for (int j = (int) arr.count-1; j >= 0; j--) {//nstextcheckingresult bread Contains range Nstextcheckingresult * result = Arr[j]; for (int i = 0; i < Face.count; i++) {if ([[[Text SubstringWithRange:result.range] isequaltostring:face[i][@ "CHS"]) {NSString * imageName = [nsstring stringwithstring:face[i][@ "PNG"]]; Nstextattachment * textattachment = [[Nstextattachment alloc]init]; Textattachment.image = [UIImage imagenamed:imagename]; nsattributedstring * Imagestr = [nsattrIbutedstring Attributedstringwithattachment:textattachment]; [Attstr ReplaceCharactersInRange:result.range withattributedstring:imagestr]; Break }}} cgsize size2=[attstr Boundingrectwithsize:cgsizemake (+) Options:nsstringdrawinguseslinefrag Mentorigin context:nil].size; size2.height+=40; Emoji Add height return size2;//returns the dimension of the property string}
Three: attribute string to normal string, key point: Picture binary alignment (can be put into a sub-thread to do)
Picture binary alignment, get picture name:
Can't get the string name directly?-(NSString *) Stringfromimage: (UIImage *) image{ nsarray *face=[self getallimagepaths]; NSData * imaged = uiimagepngrepresentation (image); NSString * IMAGENAME; for (int i=0; i<face.count; i++) { UIImage *image=[uiimage imagenamed:face[i][@ "PNG"]]; NSData *data=uiimagepngrepresentation (image); if ([imaged isequaltodata:data]) { imagename=face[i][@ "CHS"]; NSLog (@ "match succeeded!"); } } return imageName;} -(Nsarray *) getallimagepaths//array structure or the above array structure { nsbundle *bundle = [NSBundle mainbundle]; NSString * Path = [bundle pathforresource:@ "Emotions" oftype:@ "plist"]; Nsarray * face = [[Nsarray alloc]initwithcontentsoffile:path]; return face;}
The property string is converted to a normal string:
Assuming that Textview,label,button is the same
Turn the property string with the picture into a normal string-(NSString *) textstring{ nsattributedstring * att = self.attributedtext; nsmutableattributedstring * Resutlatt = [[nsmutableattributedstring Alloc]initwithattributedstring:att]; __weak __block Uitextview * copy_self = self; Enumerate all the attachment strings [att enumerateattributesinrange:nsmakerange (0, att.length) options: Nsattributedstringenumerationreverse usingblock:^ (nsdictionary *attrs, Nsrange range, BOOL *stop) { // Key-nsattachment //nstextattachment value type nstextattachment * Textatt = attrs[@ "Nsattachment"];// Get that picture from the dictionary if (textatt) { UIImage * image = Textatt.image; NSString * Text = [copy_self stringfromimage:image]; [Resutlatt Replacecharactersinrange:range withstring:text]; } ]; return resutlatt.string;}
Original address: http://blog.csdn.net/yangbingbinga/
iOS Development property String nsattributestring and NSString convert to include picture