KBKeyboardObserver 是一个方便的键盘通知观察者。
欢迎提出建议!
要安装 KBKeyboardObserver,可以
通过 alloc/init 创建一个新的 KBKeyboardObserver 对象,并设置代理
self.observer = [[KBKeyboardObserver alloc] initWithReferenceView:self.view];
self.observer.delegate = self;
或者使用方便的 UIViewController 方法代替
self.observer = [self registerForKeyboardNotifications:self];
实现代理方法以观察键盘行为(willShow, didShow, willHide 和 didHide)
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillHideToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration;
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardDidHideToRect:(CGRect)keyboardRect;
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillShowToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration;
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardDidShowToRect:(CGRect)keyboardRect;
KBKeyboardObserver 目录包含示例项目。
KBKeyboardObserver 有助于设置 UIScrollView 的 contentIndents。
#import "KBKeyboardObserver.h"
@interface ExampleViewController : UIViewController <KBKeyboardObserverDelegate>
@property (nonatomic, strong) UITextView *exampleView;
@property (nonatomic, strong) KBKeyboardObserver *keyboardObserver;
@end
@implementation ExampleViewController
- (UITextView *)exampleView
{
if (!_exampleView) {
_exampleView = [[UITextView alloc] init];
}
return _exampleView;
}
- (void)loadView
{
self.view = self.exampleView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// 1 - create new observer and retain it
self.keyboardObserver = [self registerForKeyboardNotifications:self];
}
#pragma mark - KBKeyboardObserverDelegate
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillShowToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration
{
// 2 - set content insets animation prior to the keyboard display
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, keyboardRect.size.height, 0);
[UIView animateWithDuration:duration
animations:^{
self.exampleView.contentInset = edgeInsets;
self.exampleView.scrollIndicatorInsets = edgeInsets;
}];
}
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillHideToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration
{
// 3 - set content insets animation after the keyboard dismissal
[UIView animateWithDuration:duration
animations:^{
self.exampleView.contentInset = UIEdgeInsetsZero;
self.exampleView.scrollIndicatorInsets = UIEdgeInsetsZero;
}];
}
@end
KBKeyboardObserver 有助于布局 UIView 的子视图。
#import "KBKeyboardObserver.h"
@interface ExampleViewController : UIViewController <KBKeyboardObserverDelegate>
@property (nonatomic, strong) UIView *redView;
@property (nonatomic, strong) KBKeyboardObserver *keyboardObserver;
@end
@implementation ExampleViewController
- (UIView *)redView
{
if (!_redView) {
_redView = [[UIView alloc] init];
_redView.backgroundColor = [UIColor redColor];
}
return _redView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.redView];
self.redView.frame = CGRectMake(0, self.view.bounds.size.height - 100, 100, 100);
self.keyboardObserver = [self registerForKeyboardNotifications:self];
}
#pragma mark - KBKeyboardObserverDelegate
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillShowToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration
{
[UIView animateWithDuration:duration
animations:^{
CGRect redViewFrame = self.redView.frame;
redViewFrame.origin.y = keyboardRect.origin.y - redViewFrame.size.height;
self.redView.frame = redViewFrame;
}];
}
- (void)keyboardObserver:(KBKeyboardObserver *)keyboardObserver observedKeyboardWillHideToRect:(CGRect)keyboardRect duration:(NSTimeInterval)duration
{
[UIView animateWithDuration:duration
animations:^{
CGRect redViewFrame = self.redView.frame;
redViewFrame.origin.y = keyboardRect.origin.y - redViewFrame.size.height;
self.redView.frame = redViewFrame;
}];
}