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

时间:2022-02-16 14:06:34

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[[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.创建控件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
  //声明的全局变量:
  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;
}

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