Objective-Cで、キーボードの座標や寸法を正確に取得する方法
昔、Objective-Cで作ったアプリを、iOS13に対応したかったのですが、iPhoneのバージョンが上がるにつれ、だんだんと、キーボードの座標や寸法が違う機種が現れやがり、困りました・・・orz
という事で、キーボードの座標や寸法を正確に計算する方法です。
まず、ViewDidLoadなどの、アプリケーションのエントリポイント的なメソッドの中に、NSNotificationCenterのaddObserverを使って、キーボードが表示された時にコールバック関数を呼べるようにします。
あとは、事前に作っておいたコールバック関数内でデータを取得しちゃえばOKです。
下記、例文です。
ロジックは超簡単ですが、Objective-Cで書くと、暗号のようですねw
-(void)keyboardDidShow:(NSNotification*)notification{
// [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]に、座標情報がCGRectで格納されています。
// 例えば、キーボードの真上に50pxのビューを表示させたい場合は、下記のように記述すればおkです。
int y = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
[testView setFrame:CGRectMake(txtBar.frame.origin.x, y - 50, txtBar.frame.size.width, 50)];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ↑ViewDidLoadとか、どこでも良いので、アプリケーションが起動した直後のメソッドに、下記を追加します。
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
// [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]に、座標情報がCGRectで格納されています。
// 例えば、キーボードの真上に50pxのビューを表示させたい場合は、下記のように記述すればおkです。
int y = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
[testView setFrame:CGRectMake(txtBar.frame.origin.x, y - 50, txtBar.frame.size.width, 50)];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ↑ViewDidLoadとか、どこでも良いので、アプリケーションが起動した直後のメソッドに、下記を追加します。
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
最初に記事を書いた日:2019/10/30