我有一个自定义UITextField
课程,需要在显示键盘后才能抓住它。所以,在课堂上我会听UIKeyboardWillShowNotification
并从UIKeyboardFrameEndUserInfoKey
抓住键盘的矩形。如果当前未显示键盘,则此功能非常有用。但是,如果键盘已经显示 - 例如当您在文本字段之间点击时 - UIKeyboardWillShowNotification
将仅针对点击的第一个文本字段触发。对于其他所有文本字段,我无法知道键盘的内容是什么。
有关如何在键盘显示之后获得键盘的任何建议?
答案 0 :(得分:1)
将AppDelegate
keyboardFrame
属性提供给您。让AppDelegate
观察UIKeyboardWillShowNotification
和UIKeyboardWillHideNotification
并适当更新属性。隐藏键盘时将属性设置为CGRectNull
,或添加单独的keyboardIsShowing
属性。 (您可以使用CGRectNull
功能测试CGRectIsNull
。)
然后任何对象都可以随时使用此咒语检查键盘框架:
[[UIApplication sharedApplication].delegate keyboardFrame]
如果你不想把它放到你的app委托中,你可以创建一个单独的单例类,例如。
@interface KeyboardProxy
+ (KeyboardProxy *)sharedProxy;
@property (nonatomic, readonly) CGRect frame;
@property (nonatomic, readonly) BOOL visible;
@end
@implementation KeyboardProxy
#pragma mark - Public API
+ (KeyboardProxy *)sharedProxy {
static dispatch_once_t once;
static KeyboardProxy *theProxy;
dispatch_once(&once, ^{
theProxy = [[self alloc] init];
});
return theProxy;
}
@synthesize frame = _frame;
- (BOOL)visible {
return CGRectIsNull(self.frame);
}
#pragma mark - Implementation details
- (id)init {
if (self = [super init]) {
_frame = CGRectNull;
[[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 *)note {
_frame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
}
- (void)keyboardWillHide:(NSNotification *)note {
_frame = CGRectNull;
}
@end
但是如果您使用单独的单身人士,则需要务必从应用代表的[KeyboardProxy sharedProxy]
拨打application:didFinishLaunchingWithOptions:
,以便单身人士不会错过任何通知。