欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS表情键盘的简单实现代码

程序员文章站 2023-12-20 13:15:46
最近用到了表情键盘就去网上找了下,感觉网上的都是为了更大的需求写的,而我并不需要所以就自己写了个简单的实现。 1.用到的表情字符串是从emojiplist文件里获取到的;...

最近用到了表情键盘就去网上找了下,感觉网上的都是为了更大的需求写的,而我并不需要所以就自己写了个简单的实现。
1.用到的表情字符串是从emojiplist文件里获取到的;

2.需要添加一个观察者:

[[nsnotificationcenter defaultcenter]addobserver:self selector:@selector(keyboardwillshow:) name:uikeyboardwillshownotification object:nil];
 
- (void)keyboardwillshow:(nsnotification *)notification
{
  // 键盘显示\隐藏完毕的frame
  cgrect frame = [notification.userinfo[uikeyboardframeenduserinfokey] cgrectvalue];
  // 动画时间
  cgfloat duration = [notification.userinfo[uikeyboardanimationdurationuserinfokey] doublevalue];
   
  // 动画
  [uiview animatewithduration:duration animations:^{
    commentview.miny = -frame.size.height;
  }];
}

3.创建控件:

  //声明的全局变量:
  uibutton *commentview;
  uiview *commentwhitecolorview;
  uitextfield *commenttextfield;
  uibutton *emojiandkeyboardbutton;
 
- (void)initcommenttoolbarview
{
  commentview = [[uibutton alloc]initwithframe:cgrectmake(0, 0, kscreenwidth, kscreenheight + 230)];
  commentview.hidden = yes;
  [commentview addtarget:self action:@selector(commentviewaction) forcontrolevents:uicontroleventtouchupinside];
  [self.view addsubview:commentview];
   
  commentwhitecolorview = [uiview viewwithframe:cgrectmake(0, kscreenheight - 50, kscreenwidth, 50) backgroundcolor:[uicolor whitecolor]];
  commentwhitecolorview.backgroundcolor = [uicolor whitecolor];
  [commentview addsubview:commentwhitecolorview];
   
  uiview *lightgraylineview = [uiview viewwithframe:cgrectmake(0, 0, kscreenwidth, 1) backgroundcolor:rgb(240, 240, 240)];
  [commentwhitecolorview addsubview:lightgraylineview];
   
  //文本输入框
  commenttextfield = [[uitextfield alloc]initwithframe:cgrectmake(10, 5, kscreenwidth - (10 + 42 + 60), 40)];
  commenttextfield.font = font(14);
  commenttextfield.leftview = [[uiview alloc]initwithframe:cgrectmake(0, 0, 10, 40)];
  commenttextfield.leftviewmode = uitextfieldviewmodealways;
  commenttextfield.backgroundcolor = rgb(234, 234, 234);
  commenttextfield.placeholder = @"评论";
  [commentwhitecolorview addsubview:commenttextfield];
   
  //表情和键盘切换按钮
  emojiandkeyboardbutton = [uibutton buttonwithtype:uibuttontypecustom];
  emojiandkeyboardbutton.frame = cgrectmake(commenttextfield.maxx + 7, 0, 35, 50);
  [emojiandkeyboardbutton setimage:[uiimage imagenamed:@"icon_emoji_input"] forstate:uicontrolstatenormal];
  [emojiandkeyboardbutton setimage:[uiimage imagenamed:@"icon_keyboard_input"] forstate:uicontrolstateselected];
  [emojiandkeyboardbutton addtarget:self action:@selector(emojiandkeyboardbuttonaction:) forcontrolevents:uicontroleventtouchupinside];
  [commentwhitecolorview addsubview:emojiandkeyboardbutton];
   
  //发送按钮
  uibutton *sendbutton = [uibutton buttonwithframe:cgrectmake(emojiandkeyboardbutton.maxx, commenttextfield.miny, 50, 40) type:uibuttontypecustom title:@"发送" titlecolor:rgb(135, 135, 135) imagename:nil action:@selector(sendbuttonaction) target:self];
  sendbutton.titlelabel.font = font(14);
  [sendbutton setborder:1 color:rgb(135, 135, 135)];
  [sendbutton setcornerradius:3];
  [commentwhitecolorview addsubview:sendbutton];
   
  //表情滚动视图
  emojiscrollview = [[uiscrollview alloc]initwithframe:cgrectmake(0, commentwhitecolorview.maxy, kscreenwidth, 200)];
  emojiscrollview.backgroundcolor = rgb(244, 244, 246);
  emojiscrollview.delegate = self;
  emojiscrollview.pagingenabled = yes;
  [commentview addsubview:emojiscrollview];
   
  //从文件里获取到的表情字符串数组
  emojiarray = [nsarray arraywithcontentsoffile:[[nsbundle mainbundle]pathforresource:@"emoji" oftype:@"plist"]];
   
  cgfloat emojibuttonwidth = kscreenwidth/8;
   
  int i = 0;
  //页数向上取整
  int page = ceilf(emojiarray.count/32.0);
   
  //uikit里的页面控制器
  pagecontrol = [[uipagecontrol alloc] initwithframe:cgrectmake(0, emojiscrollview.maxy, kscreenwidth, 30)];
  pagecontrol.numberofpages = page;
  pagecontrol.backgroundcolor = rgb(244, 244, 246);
  pagecontrol.pageindicatortintcolor = rgb(206, 206, 206);
  pagecontrol.currentpageindicatortintcolor = rgb(121, 121, 121);
  [commentview addsubview:pagecontrol];
   
  //设置表情滚动视图的contentsize
  emojiscrollview.contentsize = cgsizemake(kscreenwidth * page, 200);
  //循环创建表情按钮
  for (int currentpage = 0; currentpage < page; currentpage++) {
    for (int row = 0; row < 4; row++) {
      for (int column = 0; column < 8; column++) {
        uibutton *emojibutton = [uibutton buttonwithtype:uibuttontypecustom];
        if (row == 3 && column == 7) {
          //如果是第4行第8列就设置删除表情的图片替代字符串,并调用另一个方法
          [emojibutton setimage:[uiimage imagenamed:@"back_icon_input"] forstate:uicontrolstatenormal];
          [emojibutton addtarget:self action:@selector(deleteemojiaction) forcontrolevents:uicontroleventtouchupinside];
        }else{
          [emojibutton settitle:emojiarray[i++] forstate:uicontrolstatenormal];
          [emojibutton addtarget:self action:@selector(emojibuttonaction:) forcontrolevents:uicontroleventtouchupinside];
        }
        emojibutton.frame = cgrectmake(emojibuttonwidth * column + currentpage * kscreenwidth, 50 * row, emojibuttonwidth, 50);
        [emojiscrollview addsubview:emojibutton];
         
        //当i等于数组计数时就打断循环
        if (i == emojiarray.count) {
          break;
        }
      }
    }
  }
   
  //手动添加最后一个删除表情按钮
  uibutton *emojibutton = [uibutton buttonwithtype:uibuttontypecustom];
  [emojibutton setimage:[uiimage imagenamed:@"back_icon_input"] forstate:uicontrolstatenormal];
  emojibutton.frame = cgrectmake(emojibuttonwidth * 7 + 5 * kscreenwidth, 50 * 3, emojibuttonwidth, 50);
  [emojibutton addtarget:self action:@selector(deleteemojiaction) forcontrolevents:uicontroleventtouchupinside];
  [emojiscrollview addsubview:emojibutton];
}
 
//表情按钮事件
- (void)emojibuttonaction:(uibutton *)sender
{
//  nslog(@"%@",sender.currenttitle);
  nsmutablestring *oldtext = [nsmutablestring stringwithstring:commenttextfield.text];
  [oldtext appendstring:sender.currenttitle];
  commenttextfield.text = oldtext;
}
 
//删除表情按钮事件
- (void)deleteemojiaction
{
  if (commenttextfield.text.length > 1) {
    //判断是否是表情,表情length为2,所以减去2
    if ([emojiarray containsobject:[commenttextfield.text substringwithrange:nsmakerange(commenttextfield.text.length - 2, 2)]]) {
      commenttextfield.text = [commenttextfield.text substringtoindex:commenttextfield.text.length - 2];
    }else{
      commenttextfield.text = [commenttextfield.text substringtoindex:commenttextfield.text.length - 1];
    }
  }else{
    commenttextfield.text = @"";
  }
}
 
//在代理方法中调整pagecontrol
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview
{
  if (scrollview == emojiscrollview) {
    pagecontrol.currentpage = scrollview.contentoffset.x/scrollview.width;
  }
}
 
//表情和键盘切换按钮事件
- (void)emojiandkeyboardbuttonaction:(uibutton *)sender
{
  sender.selected = !sender.selected;
   
  if (sender.selected == yes) {
    [commenttextfield resignfirstresponder];
     
    [uiview animatewithduration:0.5 animations:^{
      commentview.miny = -230;
    }];
  }else{
    [commenttextfield becomefirstresponder];
  }
}
 
- (void)commentviewaction
{
  [commenttextfield resignfirstresponder];
   
  commentview.hidden = yes;
  commentview.miny = 0;
  commenttextfield.text = @"";
  emojiandkeyboardbutton.selected = no;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: