因为在聊天页面中加入表情,所以不能再用UITextVeiw了,要自己写一个图文混编的控件,参考了网上的资料,似乎这种方法比较好,不知微信是用哪种方法的?
思路如下:
1.用一个类来作为控件类。
2.提供一个方法接收字符串,返回图文混编view
3,在plist文件中编好表情名字和对应的图片名字
如下:
方法中所做的处理:
1.把字符串中的表情字符换成自己定义的字符,这是为了后面换行处理
2. 换行,根据行的最大长度换行,判断最后一个是否为英文字母或表情转义字符,决定是否压到下一行,例如英文单词应放到下一行(参考微信)
3.得到当前行中的表情坐标,存到数组中以备后面在绘制表情和文字时找到准确的位置。
4.把每一行的表情转义字符换成空格,空格的位置就是放表情的位置。
好了:
上代码:
- (UIView *)viewWithTextAndEmoticonsString:(NSString *)textAndEmoString andFont:(UIFont *)font
{
if (textAndEmoString == nil)
{
return self;
}
NSDictionary *attributes = [NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:15] forKey:NSFontAttributeName];
NSMutableArray *rowStrArr = [NSMutableArray array]; //存放每一行字符串的数组
NSMutableString *rowText = [NSMutableString string]; //是否为英文字符判断前的行字符串,未经过处理的行字符
NSString *sureRowText = [NSString string]; //最终确定的行字符串
NSString *restStr = nil; //截取每一行后剩下的字符串
NSMutableArray *emoticonsLocationXArr = [NSMutableArray array]; //存放表情x坐标的数组
NSMutableArray *emoticonsLocationYArr = [NSMutableArray array]; //存放表情y坐标的数组
NSInteger rowNum = 0;//行数
NSArray *nameAndLastStringArr = [self replaceEmoticonsWithContentStr:textAndEmoString];
self.emoticonsNameArr = [nameAndLastStringArr objectAtIndex:0];
restStr = [nameAndLastStringArr objectAtIndex:1];
float ViewWith = [restStr sizeWithAttributes:attributes].width;
if (ViewWith > rowWith)
{
ViewWith = rowWith;
}
for (int index = 0; index < restStr.length; index ++)
{
NSString *everyStr = [restStr substringWithRange:NSMakeRange(index, 1)];
[rowText appendString:everyStr];
CGSize textSize = [rowText sizeWithAttributes: attributes];
if (textSize.width >= rowWith)
{
//得到每一行的最后一个字符 c
//如果c为空格换行,空格保留在这一行,不带入下一行