• iphone聊天用几种图形(表情)与文字混排的实现与比较 [复制链接]


    一、用HTML实现文字表情混合排列
    用HTML实现图形文字混排的好处就是你不需要考虑表情在文字里面的位置问题,你只需要自己做一个HTML,然后用UIWEBVIEW加载一下,然后再把WENVIEW放到视图上,颜色字体什么都是可以调节的,但是从内存考虑,聊天一般都用UITableView做最下层的容易,因为内存容易管理,(表会自动释放),如果是用UISCrollView加载的话,则内存会逐条增加,DEMO阶段可以试试。如果用表的话,因为UIWebView加载HTML会有延迟,无论是本地还是网络,所以在CELL里面放UIWebView刷新表的时候会有闪烁的效果。所以个人觉得HTML来实现的话只适合DEMO阶段的糊弄下人,因为UIWebView也是很占资源。(这里我写了个HTML实现的例子,粗糙表达下意思,用得表我没有用UISCrollView,用UISCrollView要不停设置contentSize);
    封装HTML的代码:

    [NSString stringWithFormat:@"<body style=background-color: transparent><div style=%dpx;word-break:break-all><style>a{text-decoration:none;color:00000}</style>%@ </div></body>",m_pNewLine,string];

    类似这样,但是这个要做循环把所有的表情给转换成图片名。麻烦。
    http://dl.dbank.com/c0xpfcvxk3
    二、用UILabel+UIImageView实现图文混排
       在我看来用这个方法谈不上什么好处,但是网上也早流传这个猥琐方法的传说,这个方法实现的基本思想就是对要发送出去的内容做判断,以表情来做分割,是纯文字的就用UIlabel来存放,表情就用UIImageView来进行存放,只要算好他们他们的互相位置就可以,最终把他们放到一个UIView上,然后再加到你要显示的地方,但是这个判断还是比较繁琐的,这个方法我觉得没什么亮点,但是内存消耗还是比上面的HTML要小,这个倒是真得。切加到表里面也不会有闪烁。(这里我也写了一个例子,粗糙的将就看看吧。)
    这里放一个iphone 实时获取键盘高度的方法;注册二个键盘出来跟退下去的通知。我建议是放在开始编辑和结束编辑里面注册和remove,这样不会跟其他同类通知冲突。(这里是取的横屏的时候键盘的高度,所以是取的是宽,)

    -(void)adjustkeyboardShowView:(NSNotification *)nofi
    {
     
            NSDictionary *info = [nofi userInfo];
            NSValue * value ;
     
            value = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
     
           
     
            CGSize keyboardEndFrame = [value CGRectValue].size;
     
           
     
            int keyheight = keyboardEndFrame.width;
     
           
     
            if(keyheight == 352){
     
             }
     
            else if(keyheight ==406) {
     
              }
     }

    http://dl.dbank.com/c0g0nhmja6
    三、用drawRect实现图形文字的混排
         drawRect方法的好处就是内存什么都可以更改,字体的颜色也是可以灵活设置的,而且内存损耗比较小。
         drawRect实现的基本思想是,首先你给定的最大换行宽度是多少,然后以这个宽度来分割你输入的字符,将你分割的字符分别放入一个数组里面,当然不是随便的放得,取字符的时候要判断结尾跟开头的空格,因为在IPHONE里面结尾空格是会自动换行的,同时要判断结尾是否有表情,加上表情的话宽度是否超过最大的宽度,判断每一段字符的里面表情的位置和图片名 也需要保存起来,最后绘制文字和图片的时候分别用[string drawInRect:CGRectMake(x, y, Width, Heigh) withFont:Font]; [image drawAtPoint:CGPointMake(x,x)];
    当然如果你做得一套大小合适的图片这样就足够了,但是如果你的工程需要适应多种字体和表情大小,drawAtPoint 不能缩小图片,所以我这里写得还是一个适合多字体多种大小的小例子,(这里仍然得放一个粗糙的小例子,)代码你们懂的。
    http://dl.dbank.com/c0iaxk6gj8
    四、three20库实现图形文字的混排,

        three20库的实现比较简单了,three20自己写了一个TTLABEL,功能类似于UIWebView,也是加载类似于HTML,但是对内存控制的非常牛X,这个我也写过例子,但是没弄回来。以后有机会补上吧,不过个人觉得简单,FACEBOOK的开源库直接装了就可以用

  • 相关阅读:
    设置display:flex后 flex布局设置单个子元素靠右
    wordpress独立站菜单导航设置教程
    javascript对象数组内元素排序
    好用的在线客服系统Go语言源码GOFLY ( 开源代码+安装教程)
    解决golang报错:imports github.com/gosqldriver/mysql from implicitly required module;
    多语言在线客服系统源码自动识别中英环境私有化部署完美支持跨境电商网站
    网页在线客服代码侧边悬浮在线客服/QQ/微信/电话代码
    在线客服系统源码开发实战总结:H5 Notifications浏览器桌面通知
    在线客服系统源码开发实战总结:gin框架模板渲染html页面
    wordpress网站主题安装教程
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/2437869.html
Copyright © 2020-2023  润新知