iOS開發(fā)之自定義系統(tǒng)彈出鍵盤上方的view

這篇文章解決的一個(gè)開發(fā)中的實(shí)際問題就是:當(dāng)彈出鍵盤時(shí)习霹,自定義鍵盤上方的view育瓜。目前就我的經(jīng)驗(yàn)來看浊服,有兩種解決方法。一個(gè)就是利用UITextField或者UITextView的inputAccessoryView屬性狂巢,另一種撑毛,就是監(jiān)聽鍵盤彈出的notification來自己解決相關(guān)視圖的位置問題。

第一種解決方法相對(duì)比較簡單唧领,第二種的方法中有一個(gè)難題就是當(dāng)鍵盤的輸入方式藻雌,也就是中英文切換時(shí),鍵盤的高度是會(huì)發(fā)生變化的斩个。需要?jiǎng)討B(tài)來調(diào)整相關(guān)視圖的位置胯杭。下面開始詳細(xì)介紹解決方法。

設(shè)定inputAccessoryView屬性
UITextField或者UITextView有一個(gè)inputAccessoryView的屬性受啥,其類型是UIView做个。使用中,可以自定義一個(gè)view滚局,并將這個(gè)view傳遞給inputAccessoryView的屬性即可居暖。這種實(shí)現(xiàn)方式相對(duì)簡單,可以滿足很多情況的需求了藤肢。下面給出一些示例代碼太闺。

// 新建一個(gè)UITextField,位置及背景顏色隨意寫的嘁圈。
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 10, 200, 20)];

textField.backgroundColor = [UIColor grayColor];

[self.view addSubview:textField]; 
// 自定義的view
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];

customView.backgroundColor = [UIColor lightGrayColor];

textField.inputAccessoryView = customView; 
// 往自定義view中添加各種UI控件(以UIButton為例)
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 5, 60, 20)];

btn.backgroundColor = [UIColor greenColor];

[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside]; 

[customView addSubview:btn];

上面代碼很簡單省骂,一看就明白了蟀淮。這里的鍵盤時(shí)通過UITextField的becomeFirstResponder后彈出的。而我在開發(fā)中就碰到了一種情況钞澳,就是需要通過點(diǎn)擊一個(gè)按鈕來彈出鍵盤灭贷,同時(shí)鍵盤上方的自定義視圖中需要包含一個(gè)UITextView。這時(shí)略贮,這種情況就不適用了。需要用到第二種方法仗岖。

監(jiān)聽鍵盤事件動(dòng)態(tài)改變自定義view位置
這種方法的思路就是首先自己寫一個(gè)view逃延,然后監(jiān)聽鍵盤的事件,得到鍵盤的位置后調(diào)整自己寫的view的位置轧拄,保證這個(gè)view的下邊界與鍵盤的上邊界相接揽祥。在自定義view中包含一個(gè)UITextField或者UITextView。通過代碼調(diào)用其becomeFirstResponder方法來彈出鍵盤檩电。
下面寫一些關(guān)鍵代碼拄丰,其中自定義的view名為_mainView,全局變量俐末。

監(jiān)聽鍵盤事件代碼:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeContentViewPoint:) name:UIKeyboardWillShowNotification object:nil];

相關(guān)的函數(shù)代碼:

// 根據(jù)鍵盤狀態(tài)料按,調(diào)整_mainView的位置
- (void) changeContentViewPoint:(NSNotification *)notification{  

   NSDictionary *userInfo = [notification userInfo];  

   NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];     

   CGFloat keyBoardEndY = value.CGRectValue.origin.y; 
// 得到鍵盤彈出后的鍵盤視圖所在y坐標(biāo) 
   NSNumber *duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 

   NSNumber *curve = [userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey]; 
// 添加移動(dòng)動(dòng)畫,使視圖跟隨鍵盤移動(dòng)
   [UIView animateWithDuration:duration.doubleValue animations:^{
           [UIView setAnimationBeginsFromCurrentState:YES]; 
           [UIView setAnimationCurve:[curve intValue]];
           _mainView.center = CGPointMake(_mainView.center.x, keyBoardEndY - STATUS_BAR_HEIGHT - _mainView.bounds.size.height/2.0); 
            // keyBoardEndY的坐標(biāo)包括了狀態(tài)欄的高度卓箫,要減去 
       }]; 
}

其中添加了一個(gè)動(dòng)畫载矿,使得過渡效果好一點(diǎn)。 mainView中即可添加自定義的UI控件烹卒。注意闷盔,這個(gè)mainView中控件要從最下面開始布局,因?yàn)樯鲜龃a是以下方為準(zhǔn)的旅急。

封裝的小Demon可以直接拿來用逢勾,稍微修改一下傳入?yún)?shù)類型執(zhí)行此方法即可

- (void)addTopViewForKeyBoard:(UITextView *)addToView{

// 如果是textFiled添加則將此方法改為- (void)addTopViewForKeyBoard:(UITextFiled *)addToView即可

// 給鍵盤添加導(dǎo)航條
UIToolbar * topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 10, 320, 40)];
[topView setBarStyle:UIBarStyleBlack];
// 評(píng)論間隙
UIBarButtonItem * helloButton = [[UIBarButtonItem alloc]initWithTitle:@"輸入合作內(nèi)容" 
                style:UIBarButtonItemStylePlain target:self action:nil];
UIBarButtonItem * btnSpace = [[UIBarButtonItem alloc
                initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
// 完成按鈕
UIBarButtonItem * doneButton = [[UIBarButtonItem alloc]initWithTitle:@"完成" 
                style:UIBarButtonItemStyleDone target:self action:@selector(dismissKeyBoard)];
NSArray * buttonsArray = [NSArray arrayWithObjects:helloButton,btnSpace,doneButton,nil];
[topView setItems:buttonsArray];
[addToView setInputAccessoryView:topView];
}

_textView是需要添加視圖的文字輸入控件

// 收縮鍵盤
-(void)dismissKeyBoard
{
[_textView resignFirstResponder];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市藐吮,隨后出現(xiàn)的幾起案子溺拱,更是在濱河造成了極大的恐慌,老刑警劉巖谣辞,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盟迟,死亡現(xiàn)場離奇詭異,居然都是意外死亡潦闲,警方通過查閱死者的電腦和手機(jī)攒菠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉闰,“玉大人辖众,你說我怎么就攤上這事卓起。” “怎么了凹炸?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵戏阅,是天一觀的道長。 經(jīng)常有香客問我啤它,道長奕筐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任变骡,我火速辦了婚禮离赫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塌碌。我一直安慰自己渊胸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布台妆。 她就那樣靜靜地躺著翎猛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪接剩。 梳的紋絲不亂的頭發(fā)上切厘,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音懊缺,去河邊找鬼迂卢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桐汤,可吹牛的內(nèi)容都是我干的而克。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼怔毛,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼员萍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拣度,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤碎绎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抗果,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋帖,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冤馏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了日麸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖代箭,靈堂內(nèi)的尸體忽然破棺而出墩划,到底是詐尸還是另有隱情,我是刑警寧澤嗡综,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布乙帮,位于F島的核電站,受9級(jí)特大地震影響极景,放射性物質(zhì)發(fā)生泄漏察净。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一盼樟、第九天 我趴在偏房一處隱蔽的房頂上張望氢卡。 院中可真熱鬧,春花似錦恤批、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棋返,卻和暖如春延都,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睛竣。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工晰房, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人射沟。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓殊者,卻偏偏與公主長得像,于是被迫代替她去往敵國和親验夯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猖吴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容