軟鍵盤彈出時(shí)輸入框位置自動(dòng)調(diào)整,輸入內(nèi)容高度自適應(yīng)

最近在寫一個(gè)小應(yīng)用洪添,有一個(gè)評(píng)論功能垦页,類似微信的輸入,那么就希望在彈出鍵盤時(shí)干奢,輸入框自動(dòng)往上移動(dòng)到鍵盤上方痊焊。當(dāng)輸入內(nèi)容超過(guò)一行時(shí),輸入框高度自動(dòng)調(diào)整忿峻,但當(dāng)達(dá)到一定高度時(shí)薄啥,以滾動(dòng)條的方式滾動(dòng)內(nèi)容。
效果如圖


輸入框.png

先說(shuō)說(shuō)控件逛尚,底部是一個(gè)UIView垄惧,然后UIView內(nèi)部加入一個(gè)UITextView和UIButton。布局用Autolayout黑低。使UIView距離左赘艳,右,低邊距為0克握,高度為64蕾管。UIView內(nèi)部的UITextView距離上下左右邊距為8,UIButton距離上右邊距為8菩暗,高度為30掰曾,寬度為50.
添加兩個(gè)NSLayoutConstraint,關(guān)聯(lián)為UIView的低邊距和高度

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewHeight;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewButtom;

當(dāng)彈出鍵盤時(shí)停团,輸入框自動(dòng)往上移動(dòng)到鍵盤上方旷坦,其原理非常簡(jiǎn)單,就是把inputViewButtom的低邊距修改為鍵盤的高度佑稠,這樣UIView就自然調(diào)整到鍵盤的上方了秒梅。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHidden:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardWillShow:(NSNotification *)notification{
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    // 修改工具條底部約束
    _inputViewButtom.constant = MainScreenHeight - keyboardFrame.origin.y;
    
    // 獲得鍵盤彈出或隱藏時(shí)間
    CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    // 添加動(dòng)畫
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
}

- (void)keyboardWillHidden:(NSNotification *)notification {
    _inputViewButtom.constant = 0.0f;
}

當(dāng)輸入內(nèi)容超過(guò)一行時(shí),輸入框高度自動(dòng)調(diào)整舌胶,但當(dāng)達(dá)到一定高度時(shí)捆蜀,以滾動(dòng)條的方式滾動(dòng)內(nèi)容。其原理非常簡(jiǎn)單幔嫂,就是根據(jù)輸入的內(nèi)容調(diào)整UIView的高度辆它,由于UITextView距離上下左右邊距為8,當(dāng)UIView的高度變化時(shí)履恩,UITextView的高度也會(huì)變化锰茉。

#pragma mark - UITextViewDelegate
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]) {
        [self sendComment];
        [_inputTextView resignFirstResponder];
        return NO;
    }
    return YES;
}

- (void)textViewDidChange:(UITextView *)textView {
    [self updateInputViewUI];
}

- (void)updateInputViewUI {
    static CGFloat minHeight = 30.0f;
    static CGFloat maxHeight = 80.0f;
    CGSize constraintSize = CGSizeMake(MainScreenWidth - 78.0f, MAXFLOAT);
    CGSize size = [_inputTextView sizeThatFits:constraintSize];
    if (size.height <= minHeight) {
        size.height = minHeight;
    } else {
        if (size.height >= maxHeight) {
            size.height = maxHeight;
            _inputTextView.scrollEnabled = YES;   // 允許滾動(dòng)
        } else {
            _inputTextView.scrollEnabled = NO;    // 不允許滾動(dòng)
        }
    }
    _inputTextView.frame = CGRectMake(10.0f, 8.0f, MainScreenWidth - 78.0f, size.height);
    _inputViewHeight.constant = size.height + 16.0f;
}
- (void)sendComment {
    _inputTextView.text = @"";
    [self updateInputViewUI];
    //
}

- (IBAction)clickSendButton:(id)sender {
    [_inputTextView resignFirstResponder];
    if ([_inputTextView.text isEqualToString:@""]) {
        //
    } else {
        [self sendComment];
    }
}

點(diǎn)擊Send或者發(fā)送按鈕,最后調(diào)整為初始狀態(tài)切心。

代碼基本都列清楚了飒筑,大家也可以參考github里的工程,可以運(yùn)行來(lái)看看绽昏。https://github.com/Inspirelife96/ILSamples/tree/master/InputField

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扬霜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子而涉,更是在濱河造成了極大的恐慌著瓶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啼县,死亡現(xiàn)場(chǎng)離奇詭異材原,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)季眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門余蟹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人子刮,你說(shuō)我怎么就攤上這事威酒∫ふ觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵葵孤,是天一觀的道長(zhǎng)担钮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)尤仍,這世上最難降的妖魔是什么箫津? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宰啦,結(jié)果婚禮上苏遥,老公的妹妹穿的比我還像新娘。我一直安慰自己赡模,他們只是感情好田炭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漓柑,像睡著了一般诫肠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欺缘,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天栋豫,我揣著相機(jī)與錄音,去河邊找鬼谚殊。 笑死丧鸯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嫩絮。 我是一名探鬼主播丛肢,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剿干!你這毒婦竟也來(lái)了蜂怎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤置尔,失蹤者是張志新(化名)和其女友劉穎杠步,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榜轿,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幽歼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谬盐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甸私。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖飞傀,靈堂內(nèi)的尸體忽然破棺而出皇型,到底是詐尸還是另有隱情诬烹,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布弃鸦,位于F島的核電站绞吁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寡键。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一雪隧、第九天 我趴在偏房一處隱蔽的房頂上張望西轩。 院中可真熱鬧,春花似錦脑沿、人聲如沸藕畔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)注服。三九已至,卻和暖如春措近,著一層夾襖步出監(jiān)牢的瞬間溶弟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瞭郑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辜御,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓屈张,卻偏偏與公主長(zhǎng)得像擒权,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阁谆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)碳抄、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 臘月场绿,是他倆的結(jié)婚紀(jì)念日剖效。 那年,也是漫天雪花紛飛的時(shí)節(jié)焰盗。他單膝跪地贱鄙,右手拿著她最喜愛(ài)的紅色玫瑰花,左手拿著一個(gè)打...
    天涯佳音閱讀 226評(píng)論 0 0
  • 公司測(cè)試說(shuō)姨谷,用戶輸入了11位手機(jī)號(hào)碼后逗宁,在輸入12位時(shí),提示他只能輸入11位梦湘,先不說(shuō)這合不合產(chǎn)品需求瞎颗,對(duì)于這個(gè)功能...
    iHTCboy閱讀 18,689評(píng)論 3 10
  • 小程序頁(yè)面有2種跳轉(zhuǎn)件甥,可以在wxml頁(yè)面或者js中:1.在wxml頁(yè)面中: 2.在js頁(yè)面中: 【注意】此處注意兩...
    mindasiy閱讀 10,570評(píng)論 0 6