はじめに
現在画面にキーボードが表示されているかを知る方法を調べました。
結論として、キーボードが出すNotificationをアプリ起動時から
監視し続けることで表示状態を知ることができそうです。
表示状態を取得するクラスを作成してみました。
参考になりましたら幸いです。
キーボード状態リスナクラス
ヘッダ
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface XXXKeyboardStateListener : NSObject
+ (XXXKeyboardStateListener *)sharedInstance;
- (id)init __attribute__((unavailable("init is not available")));
- (BOOL)isHidden;
@end
実装
#import "XXXKeyboardStateListener.h"
@interface XXXKeyboardStateListener ()
{
BOOL _hidden;
}
@end
@implementation XXXKeyboardStateListener
+ (XXXKeyboardStateListener *)sharedInstance
{
static XXXKeyboardStateListener *sharedInstance;
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init
{
self = [super init];
if (self) {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
[center addObserver:self selector:@selector(didHide) name:UIKeyboardDidHideNotification object:nil];
_hidden = YES;
}
return self;
}
- (void)dealloc
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center removeObserver:self];
}
- (BOOL)isHidden
{
return _hidden;
}
- (void)didShow
{
_hidden = NO;
}
- (void)didHide
{
_hidden = YES;
}
@end
緩めのSingleton実装。
Prefixは適当に置換してください。
AppDelegateにてリスナクラスを初期生成
#import "XXXKeyboardStateListener.h"
@implementation XXXAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// キーボードリスナ生成(起動時から状態を監視するためここで生成)
[XXXKeyboardStateListener sharedInstance];
...
}
使用時
if ([[XXXKeyboardStateListener sharedInstance] isHidden]) {
...
}
おわりに
ついでにSharedInstanceの扱いも調べ直しました。
実装こうした方が良いよという部分あったらコメント等で補完して頂けると嬉しいです!
参考
How to programatically check whether a keyboard is present in iphone app?