iOS開發(fā):聊天輸入框的實現(xiàn)

經(jīng)常使用微信聊天已慢,沒事兒就會想輸入框的實現(xiàn)過程曲聂,所以抽空,也實現(xiàn)了一個輸入框的功能佑惠;

經(jīng)過封裝朋腋,使用就非常的簡單了,在需要的VC中膜楷,實現(xiàn)方法如下:

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.00];

self.keyView = [[DKSKeyboardView alloc] initWithFrame:CGRectMake(0, K_Height - 51, K_Width, 51)];

//設置代理方法

self.keyView.delegate = self;

[self.view addSubview:_keyView];

}

主要就是上面的添加旭咽,此時輸入框就已經(jīng)添加到當前的VC中;稍后會講到里面的代理方法的作用赌厅;

工程結構如下圖

主要是紅色線標出的兩個類穷绵,結構比較簡單


DKSKeyboardView.h中的代碼如下:

#import @protocol DKSKeyboardDelegate @optional //非必實現(xiàn)的方法

/**

點擊發(fā)送時輸入框內的文案

@param textStr 文案

*/

- (void)textViewContentText:(NSString *)textStr;

/**

鍵盤的frame改變

*/

- (void)keyboardChangeFrameWithMinY:(CGFloat)minY;

@end

@interface DKSKeyboardView : UIView @property (nonatomic, weak) id delegate;

@end

關于上面的兩個代理方法,由于文章篇幅問題特愿,實現(xiàn)的過程可參考demo仲墨,里面有詳細的注釋勾缭;

在DKSKeyboardView.m中,以下列出少量重要代碼目养,主要是改變frame

1漫拭、點擊輸入框,鍵盤出現(xiàn)

//鍵盤將要出現(xiàn)

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

[self removeBottomViewFromSupview];

NSDictionary *userInfo = notification.userInfo;

CGRect endFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

//獲取鍵盤的高度

self.keyboardHeight = endFrame.size.height;

//鍵盤的動畫時長

CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

[UIView animateWithDuration:duration delay:0 options:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{

self.frame = CGRectMake(0, endFrame.origin.y - self.backView.height - StatusNav_Height, K_Width, self.height);

[self changeTableViewFrame];

} completion:nil];

}

2混稽、鍵盤消失

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

//如果是彈出了底部視圖時

if (self.moreClick || self.emojiClick) {

return;

}

[UIView animateWithDuration:0.25 animations:^{

self.frame = CGRectMake(0, K_Height - StatusNav_Height - self.backView.height, K_Width, self.backView.height);

[self changeTableViewFrame];

}];

}

3采驻、點擊更多按鈕

- (void)moreBtn:(UIButton *)btn {

self.emojiClick = NO; //主要是設置表情按鈕為未點擊狀態(tài)

if (self.moreClick == NO) {

self.moreClick = YES;

//回收鍵盤

[self.textView resignFirstResponder];

[self.emojiView removeFromSuperview];

self.emojiView = nil;

[self addSubview:self.moreView];

//改變更多、self的frame

[UIView animateWithDuration:0.25 animations:^{

self.moreView.frame = CGRectMake(0, self.backView.height, K_Width, bottomHeight);

self.frame = CGRectMake(0, K_Height - StatusNav_Height - self.backView.height - bottomHeight, K_Width, self.backView.height + bottomHeight);

[self changeTableViewFrame];

}];

} else { //再次點擊更多按鈕

//鍵盤彈起

[self.textView becomeFirstResponder];

}

}

4匈勋、改變輸入框大小

- (void)changeFrame:(CGFloat)height {

CGRect frame = self.textView.frame;

frame.size.height = height;

self.textView.frame = frame; //改變輸入框的frame

//當輸入框大小改變時礼旅,改變backView的frame

self.backView.frame = CGRectMake(0, 0, K_Width, height + (viewMargin * 2));

self.frame = CGRectMake(0, K_Height - self.backView.height - self.keyboardHeight, K_Width, self.backView.height);

//改變更多按鈕、表情按鈕的位置

self.emojiBtn.frame = CGRectMake(viewMargin, self.backView.height - viewHeight - viewMargin, viewHeight, viewHeight);

self.moreBtn.frame = CGRectMake(self.textView.maxX + viewMargin, self.backView.height - viewHeight - viewMargin, viewHeight, viewHeight);

//主要是為了改變VC的view的frame

if (self.delegate && [self.delegate respondsToSelector:@selector(changeFrameWithMinY:)]) {

[self.delegate changeFrameWithMinY:self.minY];

}

}

以上就是聊天輸入框的簡單實現(xiàn)洽洁,只是提供一個實現(xiàn)思路痘系,如果在聊天界面中接入,還需要處理以下問題:

1饿自、demo中沒有做tableViewCell的高度自適應汰翠;

2、輸入框文案較多時昭雌,tableViewCell可能會出現(xiàn)紊亂复唤,此處沒有處理

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烛卧,隨后出現(xiàn)的幾起案子佛纫,更是在濱河造成了極大的恐慌,老刑警劉巖总放,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呈宇,死亡現(xiàn)場離奇詭異,居然都是意外死亡局雄,警方通過查閱死者的電腦和手機甥啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炬搭,“玉大人蜈漓,你說我怎么就攤上這事∩序颍” “怎么了迎变?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飘言。 經(jīng)常有香客問我,道長驼侠,這世上最難降的妖魔是什么姿鸿? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任谆吴,我火速辦了婚禮,結果婚禮上苛预,老公的妹妹穿的比我還像新娘句狼。我一直安慰自己,他們只是感情好热某,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布腻菇。 她就那樣靜靜地躺著,像睡著了一般昔馋。 火紅的嫁衣襯著肌膚如雪筹吐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天秘遏,我揣著相機與錄音丘薛,去河邊找鬼。 笑死邦危,一個胖子當著我的面吹牛洋侨,可吹牛的內容都是我干的。 我是一名探鬼主播倦蚪,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼希坚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陵且?” 一聲冷哼從身側響起吏够,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滩报,沒想到半個月后锅知,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡脓钾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年售睹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可训。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡昌妹,死狀恐怖,靈堂內的尸體忽然破棺而出握截,到底是詐尸還是另有隱情飞崖,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布谨胞,位于F島的核電站固歪,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜牢裳,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一逢防、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒲讯,春花似錦忘朝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晦墙,卻和暖如春悦昵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偎痛。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工旱捧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踩麦。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓枚赡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谓谦。 傳聞我的和親對象是個殘疾皇子贫橙,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容

  • 經(jīng)常使用微信聊天,沒事兒就會想輸入框的實現(xiàn)過程反粥,所以抽空卢肃,也實現(xiàn)了一個輸入框的功能; 經(jīng)過封裝才顿,使用就非常的簡單了...
    First灬DKS閱讀 7,718評論 10 12
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多莫湘,會對里面所有的內容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,477評論 1 14
  • 姓名:唐來賓 學號:17101223417 轉載http://mp.weixin.qq.com/s/vsopOQF...
    ahbz_t閱讀 873評論 0 0
  • 1. 什么是關聯(lián) 我們所有賣家的后臺操作都有可能被亞馬遜檢測到郑气,如果讓亞馬遜的程序算法認定為某幾個賬戶都是同一個人...
    百馬匯培訓閱讀 886評論 0 4
  • 5日懶懶的起床幅垮,10:18說過啦今天什么事也沒有就是起床看書,70頁。下午2:20出賓館步行走尾组,看南寧忙芒,年味比我們...
    e9c27517a4d5閱讀 252評論 1 0