Получить событие для внешней / виртуальной клавиатуры, в то время как textField станет первым респондентом

В моем приложении для iPad я представляю контроллер, использующий стиль листа формы как

controller.modalPresentationStyle=UIModalPresentationFormSheet;

В ландшафтном режиме, когда клавиатура устройства открыта, я устанавливаю размер tableView, чтобы пользователь мог видеть все записи таблицы.

Получить событие отображения / скрытия клавиатуры. Я установил NSNotification

Проблема

Но когда пользователь нажимает на текстовое поле ячейки таблицы с помощью внешней / виртуальной клавиатуры, я не получаю событие отображения / скрытия клавиатуры. Поэтому, когда текстовое поле становится первым респондентом, размер Tableview уменьшается, но в этом нет необходимости, пока пользователь подключен к внешней клавиатуре.

Может ли кто-нибудь направить / помочь здесь, что я могу сделать? Чтобы я мог перестать устанавливать размер при использовании внешней клавиатуры.

Зарегистрировать событие клавиатуры

- (void)registerForKeyboardNotifications{

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasHidden:)
                                             name:UIKeyboardDidHideNotification object:nil];

}

Установить фрейм при автоповороте и текстовое поле станет первым респондентом

-(void)setFramesOfTable
{

CGRect rct=tableView.frame;
if(appDel.isThisIPad && ([[UIApplication sharedApplication] statusBarOrientation]==UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation]==UIInterfaceOrientationLandscapeRight) && [selectedField isFirstResponder])
{
    rct.size.height=400.0;
}
else
{
    rct.size.height=576.0;
}
tableView.frame=rct;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField{

selectedField = textField;
[self setFramesOfTable];
}

-(NSUInteger)supportedInterfaceOrientations
{
[self setFramesOfTable];
return UIInterfaceOrientationMaskAll;
}

Спасибо.


person Nikunj    schedule 09.09.2013    source источник
comment
@IronManGill только что отредактировал код, но я думаю, что существующий код не поможет, так как только событие клавиатуры может решить проблему. Но не срабатывает при использовании внешней клавиатуры.   -  person Nikunj    schedule 09.09.2013


Ответы (1)


Не рекомендуется изменять рамку таблицы, когда текстовое поле начинает редактирование. На iPad пользователь может иметь внешнюю клавиатуру, пристыкованную клавиатуру или разделенную клавиатуру.

Если у пользователя есть внешняя клавиатура, вам не нужно изменять размер окна. Экранная клавиатура не появляется при использовании внешней клавиатуры, поэтому нет причин изменять размер окон.

Если пользователь использует разделенную клавиатуру, вам не нужно беспокоиться об изменении размера окон. если они разделят клавиатуру, они могут поместить клавиатуру в середину пользовательского интерфейса, что сделает невозможным (или, по крайней мере, непрактичным) изменение вашего пользовательского интерфейса так, чтобы его не покрывала хотя бы небольшая часть разделенной клавиатуры. Если пользователь разделяет клавиатуру и закрывает важные компоненты пользовательского интерфейса, ему нужно отодвинуть клавиатуру в сторону.

Лучший способ изменить размер вашего пользовательского интерфейса - использовать методы ChangeFrame / Hide на клавиатуре.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

внутри ваших обработчиков этих событий вы можете получить высоту клавиатуры и соответствующим образом настроить пользовательский интерфейс.

-(void)keyboardWillChangeFrame:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* kbFrame = info[UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [info[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [kbFrame CGRectValue];
    BOOL isPortrait = UIDeviceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation);
    CGFloat height = isPortrait ? keyboardFrame.size.height : keyboardFrame.size.width;
}

это дает вам animationDuration и высоту клавиатуры, чтобы вы могли использовать блок UIView animateWithDuration для анимации смены кадра в табличном представлении, чтобы оно не было закрыто клавиатурой.

в keyboardWillHide: вам нужно только получить animationDuration (так же, как указано выше) из NSNotification (высота, очевидно, будет равна 0). Затем используйте другой блок UIView animateWithDuration, чтобы оживить изменение размера таблицы до исходного размера.

person Alpine    schedule 11.09.2013
comment
да. Идеально нужно использовать только UIKeyboardWillChangeFrameNotification. Оттуда я могу получить высоту клавиатуры. Но из приведенного выше кода я не могу понять его правильную необходимость его преобразовать. например CGRect keyboardFrame = [[info objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect ownFrame = [appDel.window convertRect: self.view.frame fromView: self.view.superview]; CGRect closedFrame = CGRectIntersection (ownFrame, keyboardFrame); closedFrame = [appDel.window convertRect: closedFrame toView: self.view.superview]; - person Nikunj; 12.09.2013
comment
Я не уверен, что полностью понимаю, в чем ваш вопрос. Не знаю, для чего вам нужна закрытая рама. Когда у вас есть высота клавиатуры, вы, вероятно, можете просто настроить рамку вашего представления / супервизора на (исходную высоту) - (высота клавиатуры). - person Alpine; 12.09.2013