iOS 怎么做成和微信一樣的一體鍵盤?

前言: 在應用中不可避免使用到評論或者聊天輸入框,但是或多或少都會出現下面和簡書一樣的效果,在返回的時候,輸入框會被鍵盤遮擋,這一點微信和支付寶做的不錯,對于細節控來說,這個不能忍。

可以看到,在側滑返回的時候自定義的輸入框會被鍵盤遮擋,但是微信或者支付寶的鍵盤看起來就是一體的,如果你是細節控有強迫癥,你肯定也想實現這種一體鍵盤。

1、首先還是要了解監聽鍵盤彈出的通知,鍵盤通知,這篇文章大概講述了幾個的通知的區別。
2、在使用通知UIKeyboardWillChangeFrameNotification 過程中也不可避免出現和簡書聊天鍵盤返回時輸入框被鍵盤遮擋的問題

看一下效果:


WillChangFrame.gif

可以看到,跟隨鍵盤做到了,但是在返回的時候還是會出現和簡書聊天鍵盤一樣的問題。

3、再加上一直很好奇,返回時輸入框和鍵盤一體返回是怎么實現的,如果我們在鍵盤Frame已經改變的時候然后再操作輸入框 會不會實現一體的效果呢 ,所以 試了一下UIKeyboardDidChangeFrameNotification這個通知。

看一下效果:


DidChangeFrame.gif

效果圖不是很明顯,在返回的時候做到了和鍵盤一起返回,假假的一體效果,但是 在進入Viewcontroller的時候,會 出現問題。后來發現是做了動畫效果。

4、最終如果要實現既能跟隨鍵盤一起上下,返回的時候也做成假假的一體效果,我們可以 結合兩個通知使用下,我們需要使用的是:UIKeyboardWillChangeFrameNotification的進入頁面后的效果,以及UIKeyboardDidChangeFrameNotification頁面消失后單獨處理鍵盤(不加動畫)

注冊兩個通知


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
  
    self.view.backgroundColor =[UIColor whiteColor];
    self.textview =[[UITextView alloc]initWithFrame:CGRectMake(20, KScreenH - 40, KScreenW-40, 40)];
    self.textview.layer.borderColor = [UIColor blueColor].CGColor;
    self.textview.layer.borderWidth =3;
    self.textview.layer.cornerRadius = 5;
    self.textview.layer.masksToBounds = YES;
    [self.view addSubview:self.textview];
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboarDidChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
}

給一個是否做動畫的標識;

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    _isDisappear = NO;
}
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    _isDisappear = YES;
}

針對是否需要動畫對 通知做區分,DidChangeFrame不需要添加動畫:

-(void)keyboardWillChangeFrame:(NSNotification *)notification{
//        if (self.picking) return;
    /**
     notification.userInfo = @{
      鍵盤彈出\隱藏后的frame
     UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 352}, {320, 216}},
      鍵盤彈出\隱藏所耗費的時間
     UIKeyboardAnimationDurationUserInfoKey = 0.25,
      鍵盤彈出\隱藏動畫的執行節奏(先快后慢,勻速)
     UIKeyboardAnimationCurveUserInfoKey = 7
     }
     */
    
    NSDictionary *userInfo = notification.userInfo;
    // 動畫的持續時間
    double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    // 鍵盤的frame
    CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSLog(@"%@",NSStringFromCGRect(keyboardF));
    // 執行動畫
    if (!_isDisappear) {
        [UIView animateWithDuration:duration animations:^{
            // 工具條的Y值 == 鍵盤的Y值 - 工具條的高度
            
            if (keyboardF.origin.y > self.view.height) {
                self.textview.y = self.view.height- self.textview.height;
            }else
            {
                self.textview.y = keyboardF.origin.y - self.textview.height;
            }
            NSLog(@"%f",self.textview.y);
        }];

    }
   
}

-(void)keyboarDidChangeFrame:(NSNotification *)notification{
    //    if (self.picking) return;
    /**
     notification.userInfo = @{
     // 鍵盤彈出\隱藏后的frame
     UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 352}, {320, 216}},
     // 鍵盤彈出\隱藏所耗費的時間
     UIKeyboardAnimationDurationUserInfoKey = 0.25,
     // 鍵盤彈出\隱藏動畫的執行節奏(先快后慢,勻速)
     UIKeyboardAnimationCurveUserInfoKey = 7
     }
     */
    
    NSDictionary *userInfo = notification.userInfo;
    // 動畫的持續時間
//    double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    // 鍵盤的frame
    CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSLog(@"%@",NSStringFromCGRect(keyboardF));
    // 執行動畫
//    [UIView animateWithDuration:duration animations:^{
        // 工具條的Y值 == 鍵盤的Y值 - 工具條的高度
    
    if (_isDisappear) {
       
            if (keyboardF.origin.y > self.view.height) {
                            self.textview.y = self.view.height- self.textview.height;
            }else
            {
                self.textview.y = keyboardF.origin.y - self.textview.height;
            }

      
    }

    
}

最后假假的實現了這個效果:


Amy.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,200評論 4 61
  • 上周六,老師結婚,今天來上課。我們為此驚奇不已,距她結完婚只有兩天... 我們私下偷偷議論,老師為什么放著18天的...
    寂川Y閱讀 423評論 5 2
  • 一直不喜歡看時尚達人寫的暢銷書,因為覺得時尚就像流行感冒,雖然來勢洶洶,卻終究逃不掉被淘汰的命運,而這些達人們寫的...
    姬紅閱讀 975評論 3 9
  • 1 微信聊多于見面寒暄 偶然一次,在朋友圈見到有個朋友說自己剛剛清除了一遍微信聯系人,由原本的一千多人清除到剩下兩...
    梁豆芽閱讀 8,457評論 0 1