表情,文字 图文混编

因为在聊天页面中加入表情,所以不能再用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为空格换行,空格保留在这一行,不带入下一行
         
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值