輸入框跟隨鍵盤移動效果的實現

inputAccessoryView : 系統自帶的鍵盤上面的工具條視圖(並無什麼卵用)git

因爲系統自帶的工具條隨着鍵盤的隱藏也一塊兒隱藏了,而如今不少應用的需求的是鍵盤隱藏工具條停留在最底部,因此咱們須要自定義工具條(或者說輸入框吧),具體效果如圖所示:github

Demo示例工具

方式一:修改約束 constant 方式

  • 這種方式須要在storyboard或xib中找到輸入框和父控件(控制器)的約束,代碼中的self.bottomConstraint就是該約束,咱們經過監聽鍵盤的彈出和收回來更改約束的值,再加點動畫效果,就是這麼簡單學習

- (void)viewDidLoad {
    [super viewDidLoad];

    // 監聽鍵盤改變
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
}

// 移除監聽
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


// 監聽鍵盤的frame即將改變的時候調用
- (void)keyboardWillChange:(NSNotification *)note{
    // 得到鍵盤的frame
    CGRect frame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

    // 修改底部約束
    self.bottomConstraint.constant = self.view.frame.size.height - frame.origin.y;

    // 執行動畫
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
    [UIView animateWithDuration:duration animations:^{
        // 若是有須要,從新排版
        [self.view layoutIfNeeded];
    }];
}

方式二:transform 方式

  • 此方式大部分代碼和上面是同樣的,只不過此次咱們不是修改constant了,而是經過transform方式修改輸入框 鍵盤隱藏 和 鍵盤顯示 時 二者y 的 差值(必定要斷好句)動畫

/**
 *  設置輸入框
 */
- (void)setUpToolbar{
    BSPostWordToolbar *toolbar = [BSPostWordToolbar viewFromXib];
    toolbar.width = self.view.width;
    toolbar.y = BSScreenH - toolbar.height;
    
    // 添加通知監聽鍵盤的彈出與隱藏
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
    
    [self.view addSubview:toolbar];
    self.toolbar = toolbar;
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardWillChangeFrame:(NSNotification *)notification{
    // 拿到鍵盤彈出時間
    double duration = [notification.userInfo[
UIKeyboardAnimationDurationUserInfoKey
] doubleValue];

    // 計算transform
    CGFloat keyboardY = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
    CGFloat ty = keyboardY - BSScreenH;
    
    /**
     *  像這種移動後又回到原始位置的建議使用transform,由於transform能夠直接清零回到原來的位置
     */
    [UIView animateWithDuration:duration animations:^{
        self.toolbar.transform = CGAffineTransformMakeTranslation(0, ty);
    }];
}

更多關於iOS學習開發的文章請登錄個人我的博客www.zhunjiee.com,歡迎前來參觀學習spa

相關文章
相關標籤/搜索