亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

XMPP鍵盤訂制實現圖文混排

2019-11-14 18:36:52
字體:
來源:轉載
供稿:網友

  在現階段的通信服務中,各種標準都有,因此會出現無法實現相互連通,而XMPP(Extensible Message and PResence Protocol)協議的出現,實現了整個及時通信服務協議的互通。有了這個協議之后,使用任何一個組織或者個人提供的即使通信服務,都能夠無障礙的與其他的及時通信服務的用戶進行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP協議的即時通信軟件。在前面的系列博文中,我們介紹了XMPP的詳細使用(查看系列文章:http://www.49028c.com/jerehedu/p/4607599.html),下面我們就談論一下如何簡單的使用XMPP的鍵盤訂制:

  1、首先增加鍵盤的自定義小圖標和彈出效果

  效果圖如下:

#pragma mark  - 排列按鈕- (void) setUpSubviews{        //1 初始化圖片名稱    NSArray* array=@[@"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 * array=@[@"最近",@"默認",@"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、我們需要進行圖文混排將信息展示到文本框

   ?、佼旤c擊表情的時候我們需要發送通知,告訴接受者

#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群:JRedu技術交流 (452379712)

 

作者:杰瑞教育
出處:http://www.49028c.com/jerehedu/ 
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕综合一区| 色偷偷综合社区| 福利二区91精品bt7086| 国产一区二区黄| 久久人人97超碰精品888| 亚洲va欧美va国产综合剧情| 日韩av最新在线观看| 亚洲美女精品成人在线视频| 97成人精品区在线播放| 国模精品视频一区二区三区| 裸体女人亚洲精品一区| 日韩有码在线观看| 久久中文精品视频| 国产精品稀缺呦系列在线| 国产精品日韩av| 亚洲91精品在线| 8x拔播拔播x8国产精品| 97在线观看免费| 亚洲欧美中文日韩v在线观看| 日韩精品在线免费观看视频| 91极品视频在线| 精品视频在线播放免| 91精品久久久久久久久不口人| 91在线观看免费| 日韩中文字幕在线视频播放| 91高潮在线观看| 久久精品久久久久久| 国产成人综合精品在线| 久久久综合av| 精品亚洲国产成av人片传媒| 日韩av色在线| 日本精品久久久久影院| 国产视频综合在线| 国产美女直播视频一区| 欧美国产精品va在线观看| 久久久久久久久久久国产| 国产精品三级久久久久久电影| 亚洲精品电影在线观看| 亚洲最大福利视频网站| 亚洲女人初尝黑人巨大| 亚洲伊人成综合成人网| 国产福利视频一区| 亚洲精品国产精品国产自| 国产欧美日韩丝袜精品一区| 国产精品老牛影院在线观看| 欧美黄色片免费观看| 国产精品jvid在线观看蜜臀| 日韩电影在线观看中文字幕| 日韩美女在线播放| 国产在线观看一区二区三区| 欧美高清视频在线| 亚洲人午夜精品| 日韩欧美亚洲国产一区| 日本不卡视频在线播放| 精品久久香蕉国产线看观看gif| 日韩中文字幕在线视频| 91国产在线精品| 91精品国产91久久久久福利| 国产小视频91| 欧美日本亚洲视频| 亚洲男子天堂网| 性欧美长视频免费观看不卡| 成人免费观看网址| 日韩精品在线观| 日韩欧美一区二区在线| 亚洲色图狂野欧美| 在线视频国产日韩| 亚洲a成v人在线观看| 国产精品99久久久久久白浆小说| 在线电影av不卡网址| 国产一区二区成人| 亚洲一二三在线| 成人中文字幕+乱码+中文字幕| 久久国产精品久久国产精品| 欧美性猛交xxxx富婆弯腰| 精品国产乱码久久久久久婷婷| 91九色单男在线观看| 亚洲欧美中文另类| 欧美日韩中文字幕在线视频| 欧美精品第一页在线播放| 久久亚洲一区二区三区四区五区高| 久久久久国产精品免费网站| 日韩中文在线中文网在线观看| 久久久伊人日本| 国内精品久久久久久中文字幕| 一区二区三区美女xx视频| 最近日韩中文字幕中文| 国产综合福利在线| 久久精品亚洲热| 亚洲图片在线综合| 亚洲美女视频网| 国产精品va在线播放| www.国产精品一二区| 国产精品稀缺呦系列在线| 草民午夜欧美限制a级福利片| 国产精品久久久久久久久免费看| 成人激情免费在线| 欧美激情精品久久久久久黑人| 亚洲午夜激情免费视频| 国产亚洲一级高清| 国产成人精品在线视频| 色悠久久久久综合先锋影音下载| 午夜精品久久久久久久99热| 秋霞午夜一区二区| 亚洲一区二区在线播放| 亚洲综合在线做性| 色噜噜狠狠狠综合曰曰曰88av| 国产69精品久久久久久| 久久久中文字幕| 91在线视频九色| 日韩欧美a级成人黄色| 欧美精品日韩www.p站| 久久91精品国产91久久跳| 国产精品激情av电影在线观看| 欧美天堂在线观看| 欧美一级视频一区二区| 国产欧美久久一区二区| 亚洲男人天堂2019| 神马国产精品影院av| 亚洲美女av黄| 高潮白浆女日韩av免费看| 国产精品偷伦视频免费观看国产| 亚洲国产高潮在线观看| 亚洲国产日韩欧美在线99| 日韩日本欧美亚洲| 久久国产精品久久国产精品| 国产精品视频99| 国产一区二区三区中文| 欧美成人激情视频| 欧美一级bbbbb性bbbb喷潮片| 精品成人国产在线观看男人呻吟| 欧美精品久久久久久久久| 中文字幕久久亚洲| 国产精品视频播放| 亚洲日韩欧美视频| 日本精品久久电影| 国产精品白丝jk喷水视频一区| 欧美性猛交xxxx乱大交蜜桃| 亚洲成人网在线| 国产精品久久97| 国产成人精品在线观看| 日本一欧美一欧美一亚洲视频| 性色av一区二区咪爱| 亚洲国产日韩欧美在线动漫| 亚洲桃花岛网站| 91a在线视频| 亚洲欧美在线一区二区| 欧美日韩国产限制| 精品国模在线视频| 亚洲日韩第一页| 久久久国产视频| 韩国精品久久久999| 国产精品亚洲一区二区三区| 大伊人狠狠躁夜夜躁av一区| 国产一区二区三区免费视频| 亚洲色图第一页| 日韩国产精品亚洲а∨天堂免| 久久不射热爱视频精品| 欧美国产精品va在线观看| 日韩少妇与小伙激情| 久久久久这里只有精品| 日韩少妇与小伙激情| 久久99视频精品| 91免费视频国产|