iOS 鍵盤被遮擋的處理方案

UIKeyboardTypeDecimalPad 價(jià)格鍵盤

  • 設(shè)置tableView滾動(dòng)時(shí)鍵盤收起
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

獲取系統(tǒng)鍵盤的相關(guān)信息

    NSDictionary *userInfo = [notification userInfo];
    NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [value CGRectValue];
   // 鍵盤的高度
    CGFloat keyBordH = keyboardRect.size.height;
   //鍵盤彈出需要的時(shí)間
    double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  • 監(jiān)聽鍵盤彈窗液样、隱藏的通知一個(gè)方法就可以搞定
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)keyboardWillChangeFrame:(NSNotification *)note {
    // 取出鍵盤最終的frame
    CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    //判斷鍵盤升起還是落下
    CGFloat H = [UIScreen mainScreen].bounds.size.height - rect.origin.y;
    // 取出鍵盤彈出需要花費(fèi)的時(shí)間
    double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [self.tableView mas_updateConstraints:^(MASConstraintMaker *make) {
        if (H == 0) {  //鍵盤落下
            make.bottom.equalTo(self.view).offset(- 60 );
        } else { //升起
            make.bottom.equalTo(self.view).offset( - H);
        }
    }];
    //過渡動(dòng)畫
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
}

任務(wù)評(píng)價(jià)輸入框處理方案柿顶,之前開發(fā)項(xiàng)目鍵盤的處理一般都是用IQKeyboardManager第三方庫處理的棍矛,方便快捷硬贯。但是順豐的項(xiàng)目之前沒有用這個(gè)庫,所以不可能像之前小團(tuán)隊(duì)開發(fā)那樣隨便拿來就用了龙致,只能自己處理鍵盤的遮擋和隱藏了

要處理的界面1.png
要處理的界面2.png

第一種方法:計(jì)算處理(比較容易出錯(cuò)绩脆,推薦使用第二種方法)

- (void)keyboardWillShow:(NSNotification *)notification {
    //獲取系統(tǒng)鍵盤的相關(guān)信息
    NSDictionary *userInfo = [notification userInfo];
    NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [value CGRectValue];
    //獲取鍵盤相對(duì)于self.view的frame ,傳window和傳nil是一樣的
    keyboardRect = [self.view convertRect:keyboardRect fromView:self.view.window];
    CGFloat keyboardTop = keyboardRect.origin.y;
    CGFloat keyBordH = keyboardRect.size.height;
    //輸入框所在的cell相對(duì)于self.view的frame
    CGRect rect = [self.inputCell.superview convertRect:self.inputCell.frame toView:self.view];
    CGFloat inputCellBottom = CGRectGetMaxY(rect);
    //輸入cell被鍵盤遮擋
    if (keyboardTop < inputCellBottom) {
        //計(jì)算view偏移量
        CGFloat gap = keyboardTop - inputCellBottom;
        if (fabs(gap) > keyBordH) {
            //view的偏移量大于鍵盤高度
            self.view.transform = CGAffineTransformMakeTranslation(0, -keyBordH);
            [self.tableView setContentOffset:CGPointMake(0, (self.tableView.contentOffset.y + (fabs(gap) - keyBordH))) animated:NO];
        } else {
            //view的偏移量小于鍵盤高度
            self.view.transform = CGAffineTransformMakeTranslation(0, gap);
        }
    }
}

//當(dāng)鍵退出
- (void)keyboardWillHide:(NSNotification *)notification {
    //鍵盤退出 還原view的位置到原始位置
    self.view.transform = CGAffineTransformIdentity;
}

難點(diǎn)1 就是計(jì)算偏移量

思路就是把輸入框所在cell的frame和鍵盤view的frame都進(jìn)行坐標(biāo)轉(zhuǎn)換暇藏,轉(zhuǎn)換成針對(duì)self.view的坐標(biāo)

難點(diǎn)2 就是根據(jù)計(jì)算的偏移量改變view的frame

  1. 先判斷輸入框所在的cell是否被鍵盤遮擋蜜笤,如果沒有就不處理
  2. 如果遮擋了,但是偏移量小于鍵盤高度直接偏移self.view的frame即可
  3. 如果遮擋了盐碱,但是偏移量大于鍵盤高度把兔,設(shè)置view的偏移量為鍵盤高度,同事設(shè)置tableview的contentOffset值即可

第二種簡(jiǎn)單的處理方法瓮顽,推薦使用這種

晚上過代碼時(shí)县好,登哥說你這樣太麻煩了而且容易出錯(cuò),有更簡(jiǎn)單的處理方法暖混,就是利用系統(tǒng)的UITableViewController來進(jìn)行處理聘惦。

- (UITableView *)tableView {
    if (!_tableView) {
        UITableViewController *controller = [[UITableViewController alloc] init];
        controller.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
        _tableView = controller.tableView;
        _tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
        [self addChildViewController:controller];
        [controller didMoveToParentViewController:self];
    }
    return _tableView;
}

因?yàn)轫?xiàng)目中的控制器都是繼承的公共的基類控制器,所在這里不能繼承UITableViewController儒恋,就用了上面的取巧的方法善绎,然后試了一下果然奏效,登哥很給力诫尽!

參考
參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禀酱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牧嫉,更是在濱河造成了極大的恐慌剂跟,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酣藻,死亡現(xiàn)場(chǎng)離奇詭異曹洽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辽剧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門送淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怕轿,你說我怎么就攤上這事偷崩。” “怎么了撞羽?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵阐斜,是天一觀的道長。 經(jīng)常有香客問我诀紊,道長谒出,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮笤喳,結(jié)果婚禮上考赛,老公的妹妹穿的比我還像新娘。我一直安慰自己莉测,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布唧喉。 她就那樣靜靜地躺著捣卤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪八孝。 梳的紋絲不亂的頭發(fā)上董朝,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音干跛,去河邊找鬼子姜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛楼入,可吹牛的內(nèi)容都是我干的哥捕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嘉熊,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼遥赚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阐肤,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤凫佛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后儡嘶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益兄,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砰左,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毫炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡削罩,死狀恐怖碘箍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲸郊,我是刑警寧澤丰榴,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站秆撮,受9級(jí)特大地震影響四濒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一盗蟆、第九天 我趴在偏房一處隱蔽的房頂上張望戈二。 院中可真熱鬧,春花似錦喳资、人聲如沸觉吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲜滩。三九已至,卻和暖如春节值,著一層夾襖步出監(jiān)牢的瞬間徙硅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工搞疗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗓蘑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓匿乃,卻偏偏與公主長得像桩皿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幢炸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,093評(píng)論 1 32
  • 2017.02.22 可以練習(xí)业簿,每當(dāng)這個(gè)時(shí)候,腦袋就犯困阳懂,我這腦袋真是神奇呀梅尤,一說讓你做事情,你就犯困岩调,你可不要太...
    Carden閱讀 1,332評(píng)論 0 1
  • 一.UITextField屬性 0.enablesReturnKeyAutomatically 默認(rèn)為No,如果設(shè)...
    奮斗ing0310閱讀 1,639評(píng)論 0 2
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多巷燥,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,477評(píng)論 1 14
  • 今天号枕,不昨天就通知了“天鴿”臺(tái)風(fēng)要正面登陸珠海缰揪,大家伙和平時(shí)一樣做好準(zhǔn)備,但是心里都覺得“估計(jì)又要被臺(tái)風(fēng)放鴿子”葱淳。...
    朵朵頤閱讀 306評(píng)論 0 2