RxKeyboard 提供了一种响应式的方式来观察键盘 frame 的变化。忘掉那些键盘通知吧。它也能完美地与 UIScrollViewKeyboardDismissMode.interactive
协同工作。
RxKeyboard 提供了两个 Driver
。
/// 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>
使用 RxKeyboard.instance
来获取单例实例。
RxKeyboard.instance
订阅 RxKeyboard.instance.frame
来观察键盘 frame 的变化。
RxKeyboard.instance.frame
.drive(onNext: { frame in
print(frame)
})
.disposed(by: disposeBag)
🔗 我想要调整 UIScrollView
的 contentInset
来适应键盘的高度。
RxKeyboard.instance.visibleHeight
.drive(onNext: { [scrollView] keyboardVisibleHeight in
scrollView.contentInset.bottom = keyboardVisibleHeight
})
.disposed(by: disposeBag)
🔗 我想要调整 UIScrollView
的 contentOffset
来适应键盘的高度。
RxKeyboard.instance.willShowVisibleHeight
.drive(onNext: { [scrollView] keyboardVisibleHeight in
scrollView.contentOffset.y += keyboardVisibleHeight
})
.disposed(by: disposeBag)
🔗 我想要让 UIToolbar
在交互式关闭模式下随着键盘一起移动。(就像上面那张精美的 GIF 动图一样!)
如果你没有使用 Auto Layout
RxKeyboard.instance.visibleHeight
.drive(onNext: { [toolbar, view] keyboardVisibleHeight in
toolbar.frame.origin.y = view.frame.height - toolbar.frame.height - keyboardVisibleHeight
})
.disposed(by: disposeBag)
如果你正在使用 Auto Layout,你必须捕获 toolbar 的底部约束并将 constant
设置为键盘可见高度。
RxKeyboard.instance.visibleHeight
.drive(onNext: { [toolbarBottomConstraint] keyboardVisibleHeight in
toolbarBottomConstraint.constant = -1 * keyboardVisibleHeight
})
.disposed(by: disposeBag)
注意:在实际应用中,你应该在动画块中使用
setNeedsLayout()
和layoutIfNeeded()
。请查看示例项目了解示例。
还有其他问题吗?请提出 issue 或者发起 Pull Request。
在开发中,RxKeyboard 使用 Swift Package Manager 管理依赖。使用下面的命令来生成 Xcode 项目文件。注意,.xcodeproj
文件的更改不会通过 git 跟踪。
$ swift package generate-xcodeproj
使用 CocoaPods:
pod 'RxKeyboard'
使用 Carthage:
binary "https://raw.githubusercontent.com/RxSwiftCommunity/RxKeyboard/master/RxKeyboard.json"
RxKeyboard 使用 MIT 许可证。