使用cocos2dx 3.9版本开发时,有些UI需要根据键盘弹出高度自适应布局,而自带的TextField控件并未提供获取键盘高度的API,需要自己实现:
.h //oc接口头文件
@interface TKKeyBoard:NSObject - (id)init; - (void)keyboardWillShow:(NSNotification *)aNotification; - (void)keyboardWillHide:(NSNotification *)aNotification; @end
.mm
static std::function<void(bool show,int h)> m_keyBoardCallBack; @implementation TKKeyBoard -(id)init { self = [super init]; m_keyBoardCallBack=nullptr; //增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; //增加监听,当键退出时收出消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; return self; } - (void)keyboardWillShow:(NSNotification *)aNotification { NSDictionary *userInfo = [aNotification userInfo]; NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; CGRect keyboardRect = [aValue CGRectValue]; int height = keyboardRect.size.height; int width = keyboardRect.size.width; NSLog(@"键盘宽度:高度 %d-%d",width,height); if (m_keyBoardCallBack) { m_keyBoardCallBack(true,width); } } - (void)keyboardWillHide:(NSNotification *)aNotification; { if(m_keyBoardCallBack){ m_keyBoardCallBack(false,0); } } @end void tkKeyBoardCallBack(std::function<void(bool show,int h)> callback) { m_keyBoardCallBack=callback; }
.h //c++ 接口的头文件
#ifndef TKKeyBoardCpp.h #define TKKeyBoardCpp.h void tkKeyBoardCallBack(std::function<void(bool show,int h)> callback); #endif /* TKKeyBoardCpp.h */
使用方法:
在AppController.mm 中 调用[[TKKeyBoard alloc] init]; 初始化监听
在需要监听键盘行为的地方 设置tkKeyBoardCallBack() 回调