如何避免鍵盤遮擋UITextField的解決方案(下)

上一篇中我們把輸入框和按鈕歸為了一組虑啤,按回車可以跳到下一項(xiàng)辐啄。接下來我們要獲取鍵盤高度并對UIView進(jìn)行調(diào)整漓骚。

1.先補(bǔ)充一些成員變量
//.m

@interface ViewController ()<UITextFieldDelegate> {
    BOOL _isKeyboardShowing;
    UITextField *_activeTextField;
    BOOL _addedObserver;
    NSArray *_inputFocuses;
    BOOL _pressedReturn;
    //-----------新代碼-----------
    float _keyboardHeight;
    BOOL _invokeDelegateNow;
    //---------------------------
}

2.接下來先從最簡單的方法實(shí)現(xiàn)起來。隱藏鍵盤的時(shí)候恢復(fù)視圖原有位置。
//.m

//-----------新代碼-----------
- (void)hideKeyBoard {
    NSTimeInterval animationDuration = 0.30f;
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];

    //將視圖的Y坐標(biāo)向上移動(dòng)offset個(gè)單位耽梅,以使下面騰出地方用于軟鍵盤的顯示
    self.view.bounds =CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);

    [UIView commitAnimations];
}
//---------------------------

3.實(shí)現(xiàn)KeyboardWillHide:消息。如果點(diǎn)擊回車切換到下一個(gè)輸入框胖烛,鍵盤會(huì)先消失眼姐,也會(huì)觸發(fā)這個(gè)消息诅迷。所以我們只需要在點(diǎn)擊輸入框之外的時(shí)候隱藏鍵盤。否則視圖會(huì)先回到原位再根據(jù)下一個(gè)文本框位置調(diào)整自己的位置众旗,視覺上不連貫罢杉。

//.m

- (void)KeyboardWillHide:(NSNotification *)notification {
    //-----------新代碼-----------
    _isKeyboardShowing = NO;
    if (!_pressedReturn) {
        [self hideKeyBoard];
    }
    else {
        _pressedReturn = NO;
    }
    //---------------------------
}
  1. KeyboardWillShow:消息中獲得鍵盤高度以后手動(dòng)調(diào)用一次鍵盤代理方法textFieldDidBeginEditing:

//.m

- (void)KeyboardWillShow:(NSNotification *)notification {
    _isKeyboardShowing = YES;
    //-----------新代碼-----------
    NSDictionary *info = [notification userInfo];

    //獲取高度
    NSValue *value = [info objectForKey:@"UIKeyboardBoundsUserInfoKey"];
    if (!value) {
        @throw [NSException exceptionWithName:@"error when getting Keyboard Rect" reason:@"maybe not supported in sdk" userInfo:nil];
    }

    CGSize keyboardSize = [value CGRectValue].size;
    _keyboardHeight = keyboardSize.height;

    _invokeDelegateNow = YES;
    [self textFieldDidBeginEditing:_activeTextField];
    //---------------------------
}

5.回到鍵盤代理方法之前先實(shí)現(xiàn)一個(gè)根據(jù)輸入框位置調(diào)整UIView的方法。

//.m

//-----------新代碼-----------
- (void)autoAdjustTextFieldHeight:(UITextField *)textField
{
    CGRect frame = textField.frame;
    CGPoint point = frame.origin;
    CGRect viewBounds = self.view.bounds;

    int offset = point.y + frame.size.height - (viewBounds.size.height - _keyboardHeight);

    NSTimeInterval animationDuration = 0.30f;
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];

    //將視圖的Y坐標(biāo)向上移動(dòng)offset個(gè)單位贡歧,以使下面騰出地方用于軟鍵盤的顯示
    self.view.bounds = CGRectMake(0, offset > 0 ? ABS(offset) : 0, viewBounds.size.width, viewBounds.size.height);

    [UIView commitAnimations];
}
//---------------------------

6.回到textFieldDidBeginEditing:滩租,根據(jù)_invokeDelegateNow來決定是否調(diào)整視圖高度。

//.m

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    _pressedReturn = NO;//按下return和直接點(diǎn)擊text field都會(huì)觸發(fā)這個(gè)方法利朵,所以用一個(gè)標(biāo)示的變量來區(qū)分律想,后面會(huì)發(fā)揮作用的。
    _activeTextField = textField;

    //-----------新代碼-----------
    //重要:這里的_invokeDelegateNow標(biāo)記的作用是這樣的绍弟,用戶點(diǎn)擊文本框會(huì)先觸發(fā)這個(gè)代理方法技即,此時(shí)沒有從KeyboardWillShow:的實(shí)現(xiàn)中獲取鍵盤高度。_invokeDelegateNow會(huì)在KeyboardWillShow:中被標(biāo)記為YES然后手動(dòng)再次調(diào)用這個(gè)代理方法(不是由系統(tǒng)調(diào)用)樟遣。此時(shí)再執(zhí)行調(diào)整視圖高度的操作而叼,才能根據(jù)鍵盤高度來調(diào)整。
    if (_invokeDelegateNow) {
        [self autoAdjustTextFieldHeight:textField];
    }
    //---------------------------
}

7.最后更新一下回車的方法豹悬。當(dāng)回車以后的操作為點(diǎn)擊按鈕時(shí)葵陵,隱藏鍵盤。當(dāng)回車的操作為跳到下一個(gè)輸入框時(shí)瞻佛,調(diào)整視圖位置脱篙。

//.m

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    int index = [_inputFocuses indexOfObject:textField];
    if (index == [_inputFocuses count] - 1) {//如果是最后一個(gè)text field時(shí)按return 就點(diǎn)擊按鈕
        [self click:_button];
        [self hideKeyBoard];
    }
    else {//如果沒有到最后一個(gè)text field就將焦點(diǎn)轉(zhuǎn)向下一個(gè)text field
        UITextField *nextTextField = [_inputFocuses objectAtIndex:(index + 1)];
        [nextTextField becomeFirstResponder];
        [self autoAdjustTextFieldHeight:nextTextField];
    }
    UITextField *currentTextField = [_inputFocuses objectAtIndex:index];
    [currentTextField resignFirstResponder];
    return NO;
}

這就是我的解決方案,希望能夠幫助到大家涤久。如果代碼用下來有什么問題,請留言忍弛。
工程已上傳GitHub:https://github.com/manuqiao/TextFieldAutoAdjustment

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末响迂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子细疚,更是在濱河造成了極大的恐慌蔗彤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疯兼,死亡現(xiàn)場離奇詭異然遏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吧彪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門待侵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姨裸,你說我怎么就攤上這事秧倾≡乖停” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵那先,是天一觀的道長农猬。 經(jīng)常有香客問我,道長售淡,這世上最難降的妖魔是什么斤葱? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮揖闸,結(jié)果婚禮上揍堕,老公的妹妹穿的比我還像新娘。我一直安慰自己楔壤,他們只是感情好鹤啡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹲嚣,像睡著了一般递瑰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隙畜,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天抖部,我揣著相機(jī)與錄音,去河邊找鬼议惰。 笑死慎颗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的言询。 我是一名探鬼主播俯萎,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼运杭!你這毒婦竟也來了夫啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤辆憔,失蹤者是張志新(化名)和其女友劉穎撇眯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱咧,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熊榛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕巡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玄坦。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绘沉,靈堂內(nèi)的尸體忽然破棺而出营搅,到底是詐尸還是另有隱情云挟,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布转质,位于F島的核電站园欣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏休蟹。R本人自食惡果不足惜沸枯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赂弓。 院中可真熱鬧绑榴,春花似錦、人聲如沸盈魁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨耙。三九已至赤套,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間珊膜,已是汗流浹背容握。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车柠,地道東北人剔氏。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像竹祷,于是被迫代替她去往敵國和親谈跛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫塑陵、插件感憾、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 正則表達(dá)式,一個(gè)十分古老而又強(qiáng)大的文本處理工具猿妈,僅僅用一段非常簡短的表達(dá)式語句吹菱,便能夠快速實(shí)現(xiàn)一個(gè)非常復(fù)雜的業(yè)務(wù)邏...
    lujincang閱讀 225評論 0 0
  • 有個(gè)傻B學(xué)起來很瘋巍虫,玩起來也是很瘋彭则。 這個(gè)傻B高中坐在我后面,騷擾了我兩年占遥。 這個(gè)傻B上課總是喊我俯抖,...
    twoxuaner閱讀 330評論 0 0