在現階段的通信服務中,各種標準都有,因此會出現無法實現相互連通,而XMPP(Extensible Message and PResence Protocol)協議的出現,實現了整個及時通信服務協議的互通。有了這個協議之后,使用任何一個組織或者個人提供的即使通信服務,都能夠無障礙的與其他的及時通信服務的用戶進行交流。例如google 公司2005年推出的Google talk就是一款基于XMPP協議的即時通信軟件。在前面的系列博文中,我們介紹了XMPP的詳細使用(查看系列文章:http://www.companysz.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、我們需要進行圖文混排將信息展示到文本框
①當點擊表情的時候我們需要發送通知,告訴接受者
#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)
新聞熱點
疑難解答