Есть ли изящный способ получения кадра (размера) любого входного вида в настоящее время? Изящным я имею в виду не увольнение, а затем повторное включение первого ответчика, поскольку это отбрасывает любые данные состояния kbd, например. Состояние клавиши Shift.Получить текущую рамку клавиатуры изящно?
То, что я в настоящее время сделать это:
- (CGSize)inputViewSize
{
__block CGSize result = CGSizeZero;
UIResponder *firstResponder = [self getFirstResponder];
id observer = [NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note)
{
result = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
}];
[firstResponder resignFirstResponder];
[firstResponder becomeFirstResponder];
[NSNotificationCenter.defaultCenter removeObserver:observer];
return result;
}
EDIT: То, что я должен был делать это:
@implementation UIApplication (KeyboardFrame)
static CGRect _keyboardFrame = (CGRect){ (CGPoint){ 0.0f, 0.0f }, (CGSize) { 0.0f, 0.0f } };
+ (CGSize)keyboardSize { return _keyboardFrame.size; }
+ (void)load
{
[NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note)
{
_keyboardFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
}];
[NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardDidChangeFrameNotification object:nil queue:nil usingBlock:^(NSNotification *note)
{
_keyboardFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
}];
[NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardDidHideNotification object:nil queue:nil usingBlock:^(NSNotification *note)
{
_keyboardFrame = CGRectZero;
}];
}
@end
Они не вызывают каких-либо больше, чем 'UIKeyboardDidShowNotification', если' firstResponder' не первый подал в отставку, а затем повторно активируется, что то, что я надеюсь, чтобы избежать здесь. –
Я только что протестировал. Эти уведомления работают для меня как-то. –
Просьба уточнить код. Чтобы напомнить вам, будущие изменения фрейма клавиатуры меня не интересуют (и я знаю, как это сделать), только существующий фрейм во время вызова. –