XMPP键盘订制实现图文混排

  在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互通。有了这个协议之后,使用任何一个组织或者个人提供的即使通信服务,都能够无障碍的与其他的及时通信服务的用户进行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP协议的即时通信软件。在前面的系列博文中,我们介绍了XMPP的详细使用(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#xmpp),下面我们就谈论一下如何简单的使用XMPP的键盘订制:

  1、首先增加键盘的自定义小图标和弹出效果

  效果图如下:

#pragma mark  - 排列按钮
- (void) setUpSubviews{

    //1 初始化图片名称
    NSArray* [email protected][@"compose_camerabutton_background_os7",@"compose_toolbar_picture_os7",@"compose_mentionbutton_background_os7",@"compose_trendbutton_background_os7",@"compose_emoticonbutton_background_os7"];

    //2 排列按钮
    CGFloat space=(kWidth-kMargin*2-kItemNum*kItemWidth)/(kItemNum-1)+kItemWidth;

    for (int i=0; i<kItemNum; i++) {

        UIButton * button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.tag=i;
        button.frame=CGRectMake(kMargin+i*space, self.frame.size.height/2.0-kItemHeight/2.0, kItemWidth, kItemHeight);

//        button.backgroundColor=JRRandomColor();
        [button setBackgroundImage:[UIImage imageNamed:array[i]] forState:UIControlStateNormal];

        //Actions 按钮事件
        [button addTarget:self action:@selector(btClick:) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:button];
    }

}

/增加键盘事件弹出通知监控
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyUp:) name:UIKeyboardWillShowNotification object:nil];

    //增加键盘事件消失通知监控
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyDown:) name:UIKeyboardWillHideNotification object:nil];

#pragma mark - 键盘升起来
- (void) keyUp:(NSNotification *) notification{

    //获取动画的时间
    CGFloat animaTime=[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];

    //获取键盘的尺寸(用来确定动画的范围)
    CGRect frame=[notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

    //控制键盘动画
    [UIView animateWithDuration:animaTime animations:^{
        self.keyAccess.transform=CGAffineTransformMakeTranslation(0, frame.size.height*-1);
    }];

}
#pragma mark - 键盘落下去
- (void) keyDown:(NSNotification *) notification{

    //获取动画的时间
    CGFloat animaTime=[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];

    [UIView animateWithDuration:animaTime animations:^{
        self.keyAccess.transform=CGAffineTransformIdentity;
    }];

}

  2、定义自定义键盘的图标

  表情主要分为三块默认,Emoji,浪小花,默认和浪小花为图标,而Emoji为字符,因此我们需要进行特殊处理。效果图如下:

  代码如下:

  1、我们首先自定义键盘视图,同时我们需要把表情抽取出来因此还需要自定义一个滚动表情视图

  //增加滚动表情
        [self setUpSrollEmotion];

        //增加自定义的tab
        [self setUpTab];

        //设置默认第一个
        if (self.btArray.count>1) {
            [self clickBt:self.btArray[1]];
            self.emotionScroll.emotionArray=self.defaultArray;
        }else{
            [self clickBt:[self.btArray firstObject]];
        }
pragma mark - 自定义键盘布局
#pragma mark 设置滚动表情
- (void) setUpSrollEmotion{

    JRScrollEmotion * scroll=[[JRScrollEmotion alloc] initWithFrame:CGRectMake(0, 0, kWidth, self.frame.size.height-44)];
    self.emotionScroll=scroll;

    scroll.emotionArray=nil;
    [self addSubview:scroll];

}

#pragma mark 增加tab
- (void) setUpTab{

    UIView * bgview=[[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height-44, kWidth, 44)];
    bgview.backgroundColor=JRColor(109, 109, 109);
    [self addSubview:bgview];

    //计算按钮宽度
    CGFloat width=kWidth/4.0;
    //标题数组
    NSArray * [email protected][@"最近",@"默认",@"Emoji",@"浪小花"];

    for (int i=0 ; i<4; i++) {

        UIButton * button=[[UIButton alloc] initWithFrame:CGRectMake(i*width, 0, width, 44)];
        button.tag=i;
        [button setTitle:array[i] forState:UIControlStateNormal];
        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(clickBt:) forControlEvents:UIControlEventTouchUpInside];
        [self.btArray addObject:button];
        [bgview addSubview:button];

    }

}

  2、第二步我们需要进行对表情进行循环布局,每个表情作为一个button,我们进行循环摆放

-(void)setEmotionArray:(NSArray *)emotionArray{
    _emotionArray=emotionArray;

    //移除所有button
    [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    //计算总页数
    NSInteger totalPage=ceil(self.emotionArray.count/23.0);
    self.contentSize=CGSizeMake(totalPage*kWidth, 0);
    CGFloat hspace=(kWidth-40-8*35)/7.0+35;
    CGFloat vspace=(self.frame.size.height-20-3*35)/2.0+35;

    for (int i=0; i<self.emotionArray.count; i++) {
        NSInteger nowPage=[self getNowPageWith:i];

        NSInteger col=(i-nowPage*23)%8;
        NSInteger row=(i-nowPage*23)/8;

        UIButton *button=[[UIButton alloc ] initWithFrame:CGRectMake(nowPage*kWidth+20+col*hspace, 10+row*vspace, 35, 35)];

        //根据表类型设置图片
        JREmotionModel * model=self.emotionArray[i];

        if (model.imageName==nil) {//emoji表情
            [button setTitle:model.emoji forState:UIControlStateNormal];
            button.titleLabel.font=[UIFont systemFontOfSize:35];
        }else{
          [button setImage:[UIImage imageNamed:model.imageName] forState:UIControlStateNormal];
        }

        //监控点击事件
        button.tag=i;
        [button addTarget:self action:@selector(emotionClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];

    }

    for (int i=0; i<totalPage; i++) {

        //增加删除按钮
        UIButton *button= [UIButton buttonWithType:UIButtonTypeCustom];

        if (i<totalPage-1) {
            button.frame=CGRectMake(kWidth-35-20+i*kWidth, vspace*2+10, 35, 35);
        }else{
            //获取剩下的个数
            NSInteger numLeft= self.emotionArray.count-i*23;
            NSInteger row=(numLeft)/8;
            NSInteger col=(numLeft)%8;
            button.frame=CGRectMake(i*kWidth+20+hspace*col, 10+vspace*row, 35, 35);
        }

        //====
        [button setImage:[UIImage imageNamed:@"compose_emotion_delete_highlighted"] forState:UIControlStateNormal];

        [button addTarget:self action:@selector(emotionDelete) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:button];

    }

}

  3、我们需要进行图文混排将信息展示到文本框

    ①当点击表情的时候我们需要发送通知,告诉接受者

#pragma mark - 表情点解
- (void) emotionClick:(UIButton *) button{

    //获取对应的表情模型
    JREmotionModel *model=self.emotionArray[button.tag];

    //发送通知
    [[NSNotificationCenter defaultCenter] postNotificationName:AddEmotionNotification object:nil userInfo:@{@"emotion":model}];

    ②接收到通知后通过富文本技术进行显示

- (void)addEmotion:(NSNotification * ) notification{

   JREmotionModel * model= notification.userInfo[@"emotion"];

    //如果是Emoji表情直接插入文本即可
    if (model.imageName.length==0) {
        [self.tf insertText:model.emoji];
    }else{
        //获取之前的文本
        NSAttributedString * text=self.tf.attributedText;

        //将之前的文本包含进去
        NSMutableAttributedString * attr=[[NSMutableAttributedString alloc] initWithAttributedString:text];

        //记录当前的位置
        NSInteger index;

        //如果是图片表情,需要重新初始化一个附件,并设置图片然后拼接
        JRTextAttachMent * temAttch=[[JRTextAttachMent alloc] init];
        temAttch.model=model;
        temAttch.bounds=CGRectMake(0, -2.5, self.tf.font.lineHeight-5, self.tf.font.lineHeight-5);
        temAttch.image=[UIImage imageNamed:model.imageName];

        NSAttributedString * tempStr=[NSAttributedString attributedStringWithAttachment:temAttch];

        //保存一下之前的位置
        index=self.tf.selectedRange.location;
        [attr insertAttributedString:tempStr atIndex:index];

        //重新给文本框赋值
        [attr addAttribute:NSFontAttributeName value:self.tf.font range:NSMakeRange(0, attr.length)];
        self.tf.attributedText=attr;
        self.tf.selectedRange=NSMakeRange(index+1, 0);

    }

}

  想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。

  疑问咨询或技术交流,请加入官方QQ群: (452379712)

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-08-13 03:10:03

XMPP键盘订制实现图文混排的相关文章

仿QQ聊天图文混排流程图【适用于XMPP】

图文混排流程图.graffle4.8 KB 下面附上图片素材: 表情.zip692.5 KB 下面是字符串与图片的详细对应关系: "[呲牙]"字符串对应于图片名    f000.gif; "[调皮]"字符串对应于图片名    f001.gif; "[流汗]"字符串对应于图片名    f002.gif; "[偷笑]"字符串对应于图片名    f003.gif; "[再见]"字符串对应于图片名    f004.

关于仿网易新闻中详细页图文混排功能的实现

最近在了解关于新闻内容的图文混排的效果,网上有人开源一个仿网易新闻的代码,本文就是简单记录学习其详细页面显示的效果实现: 下载地址:https://github.com/dsxNiubility/SXNews 效果图: 其原理:通过网络请求获得相关的信息,再通过手机端进行拼HTML,然后在WebView进行展示,此处还对文章中的图片增加点击效果,可以保存到相册中:文章的样式已经存在项目中,直接去调用: 1:首先了解两个相关的实体对象,一个是新闻的主体内容,另外一个就是图片的相关信息实体: 1:主

用NSAttributedString实现简单的图文混排

iOS7以后,因为TextKit的强大,可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment). 关于Textkit的牛逼之处,可以参考objcio上的文章(https://objccn.io/issue-5-1/) 我用NSAttributedString仿写了一个知乎的输入框(低仿,就是有个功能而已),效果如图: demo在这里:(https://github.com/Phelthas/TEST_XMLCommon   的第四个) 有几

AS3聊天单行输入框图文混排完美实现

几年前刚毕业,第一个游戏模块做的就是聊天.到现在,几个游戏写过几次聊天模块, 之前在4399做的<幻龙骑士>(又名<神骑士>),还有上周六刚上线的<疯狂的子弹>, 用的是同一套代码,聊天输入框没有图文混排,而是用符号代替,输出面板才有图文混排. 输出面板的图文混排由于内容没有键鼠操作,实现很简单,不在本文讨论之列:当然本 文的代码中抽出一小部分就可以实现了.以上两款游戏没有加密,有兴趣的可以去弄来看看, <子弹>里面的键鼠.技能.射击.弹道搞得好累人啊 ?(

iOS 图文混排 链接 可点击

对于这个话题 我想到 1 第一个解决方法就是使用 webView 比较经典 把所有复杂工作都交给控件本身去处理了,  但是好像好多需要自定义的地方 没法从 webView获得响应回调 :(估计也可以实现 也比较复杂,而且 这个需要对 html编码进行分析理解剥离等) 2 富文本方式 核心框架 coretext 图文混排 一点问题都没有 关键是怎么对 目标图片 或者链接 进行触发响应 要点: (1)首先要封装的要相对独立 拓展也方便  首当其冲就是  和服务端约定的 数据模型 CoreTextMo

NGUI研究之有点坑爹的图文混排

 最近研究了了一下NGUI的图文混排工具,得出的结论是有点坑爹..大家看看我的测试步骤,我用的是目前NGUI的版本3.6.6 . 当我在 Open BitMapFont Marker 的时候界面上出现Assets/NGUI/Editor/FreeType.dylib is missing 的字样.于是查了一下,大概意思是必须要把FreeType.dylib 文件拷贝在/usr/local/lib/FreeType.dylib路径下面.FreeType.dylib 文件在NGUI/Editor

浅析微博页面图文混排中遇到的问题

在表情键盘的图文混排中,会有很多细节问题.有的时候不理解其中的原因是很难改正的.本文主要是整理我遇到的各种问题及解决方案,供大家分享.如果你以前也遇到过类似的问题可以用我的方法修正了,希望能够对博友们有所帮助.本文使用swift语言,OC的可能看不惯,但大多方法基本是一样的就是语法不同. 上期回顾:关于微博编辑页面添加表情键盘 如果你不是在董铂然博客园看到本文,请点击查看原文. 1.默认每添加一个表情是添加到最后,但是我们想添加到光标位置 默认做法(其中的str是通过点击某个表情通过代理传来的表

(一一一)图文混排基础 -利用正则分割和拼接属性字符串

很多时候需要用到图文混排,例如聊天气泡中的表情,空间.微博中的表情,例如下图: 红心和文字在一起. 比较复杂的情况是表情夹杂在文字之间. 要实现这种功能,首先要介绍iOS中用于显示属性文字的类. 用于文字显示的类除了text属性之外,还有attributedText属性,这个属性是NSAttributedString类型,通过这个属性可以实现不同文字的不同字体.颜色甚至把图片作为文字显示的功能. 下面介绍这个字符串的使用. 以一条微博内容为应用场景,介绍如何从中找出表情.话题等内容,其中表情替换

经验之谈—正則表達式实现图文混排

在项目中,我们常常须要发表情,以及常常须要将表情字符转换成表情.由于表情是一个图片.所以我们发给server的时候,实际上是发一段特殊的文字给server,然后转换成表情.以免浪费用户过多的流量. 那接下来.我们就来介绍一下,怎样使用正則表達式实现图文混排呢? 为了以后的代码的管理方便,我们抽取出两个类: NSString+Regular.h中.我们暴露两个方法出来: /** * 返回正則表達式匹配的第一个结果 * * @param pattern 正則表達式 * * @return 匹配的第一