RxKeyboard provides a reactive way of observing keyboard frame changes. Forget about keyboard notifications. It also perfectly works with UIScrollViewKeyboardDismissMode.interactive.
RxKeyboard provides two Drivers.
/// An observable keyboard frame.
let frame: Driver<CGRect>
/// An observable visible height of keyboard. Emits keyboard height if the keyboard is visible
/// or `0` if the keyboard is not visible.
let visibleHeight: Driver<CGFloat>
/// Same with `visibleHeight` but only emits values when keyboard is about to show. This is
/// useful when adjusting scroll view content offset.
let willShowVisibleHeight: Driver<CGFloat>Use RxKeyboard.instance to get singleton instance.
RxKeyboard.instanceSubscribe RxKeyboard.instance.frame to observe keyboard frame changes.
RxKeyboard.instance.frame
.drive(onNext: { frame in
print(frame)
})
.addDisposableTo(disposeBag)-
🔗 I want to adjust
UIScrollView'scontentInsetto fit keyboard height.RxKeyboard.instance.visibleHeight .drive(onNext: { keyboardVisibleHeight in scrollView.contentInset.bottom = keyboardVisibleHeight }) .addDisposableTo(disposeBag)
-
🔗 I want to adjust
UIScrollView'scontentOffsetto fit keyboard height.RxKeyboard.instance.willShowVisibleHeight .drive(onNext: { keyboardVisibleHeight in scrollView.contentInset.offset.y += keyboardVisibleHeight }) .addDisposableTo(disposeBag)
-
🔗 I want to make
UIToolbarmove along with the keyboard in an interactive dismiss mode. (Just like the wonderful GIF above!)If you're not using Auto Layout:
RxKeyboard.instance.visibleHeight .drive(onNext: { keyboardVisibleHeight in toolbar.frame.origin.y = self.view.height - toolbar.frame.height - keyboardVisibleHeight }) .addDisposableTo(disposeBag)
If you're using Auto Layout, you have to capture the toolbar's bottom constraint and set
constantto keyboard visible height.RxKeyboard.instance.visibleHeight .drive(onNext: { keyboardVisibleHeight in toolbarBottomConstraint.constant = -1 * keyboardVisibleHeight }) .addDisposableTo(disposeBag)
Note: In real world, you should use
setNeedsLayout()andlayoutIfNeeded()with animation block. See the example project for example. -
Anything else? Please open an issue or make a Pull Request.
- Swift 3
- iOS 8+
RxKeyboard is under MIT license.

