2013-09-09 2 views
0

В моем IPad приложения, я хочу представить контроллер, используя стиль формы листа, какПолучить событие для внешнего/виртуальной клавиатуры в то время как TextField стать первым ответчиком

controller.modalPresentationStyle=UIModalPresentationFormSheet; 

В ландшафтном режиме в то время как размер клавиатуры открыта настройка им устройства из Tableview так этот пользователь может видеть все записи таблицы.

Чтобы получить информацию о шоу/скрыть клавиатуру. Я поставил NSNotification

Проблема

Но когда пользователь крана в TextField из ячейки таблицы с помощью внешнего/виртуальной клавиатуры, я не получаю событие клавиатуры показать/скрыть. Итак, когда текстовое поле становится первым ответчиком, размер 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]; 

} 

Набор кадров Во время AutoRotate и Text Field Стать Плавников

-(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; 
} 

Спасибо.

+0

Код PLS? ..... – IronManGill

+0

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

ответ

1

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

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

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

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

[[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; 
} 

это дает вам анимациюDuration и высоту клавиатуры, так что вы можете использовать блок UIView animateWithDuration, чтобы анимировать смену фрейма в вашем табло, чтобы он не был закрыт клавиатурой.

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

+0

Да. необходимо использовать только UIKeyboardWillChangeFrameNotification. Оттуда я могу получить высоту клавиатуры. Но из-за выше кода я не могу правильно его исправить. как CGRect keyboardFrame = [[info objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect ownFrame = [appDel.window convertRect: self.view.frame fromView: self.view.superview]; CGRect coverFrame = CGRectIntersection (собственный фрейм, клавиатура); coverFrame = [appDel.window convertRect: coverFrame toView: self.view.superview]; – Nikunj

+0

Я не уверен, что полностью понимаю, в чем ваш вопрос. Я не знаю, для чего вам нужна крытая рамка. Как только у вас будет высота клавиатуры, вы можете просто настроить рамку вашего представления/супервизора как (оригинальная высота) - (высота клавиатуры). – Alpine

 Смежные вопросы

  • Нет связанных вопросов^_^