Пользовательская клавиатура (iPhone), UIKeyboardDidShowNotification и UITableViewController - PullRequest
1 голос
/ 12 марта 2010

В приложении для iPhone у меня есть пользовательская клавиатура, которая работает как стандартная клавиатура; появляется, если пользовательское текстовое поле становится первым респондентом и скрывается, если поле уходит в отставку первым респондентом. Я также выкладываю Generic UIKeyboardWillShowNotification, UIKeyboardDidShowNotification и их скрывающие аналоги, например:

NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:5];
[userInfo setObject:[NSValue valueWithCGPoint:self.center]
             forKey:UIKeyboardCenterBeginUserInfoKey];
[userInfo setObject:[NSValue valueWithCGPoint:shownCenter]
             forKey:UIKeyboardCenterEndUserInfoKey];
[userInfo setObject:[NSValue valueWithCGRect:self.bounds]
             forKey:UIKeyboardBoundsUserInfoKey];
[userInfo setObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseOut]
             forKey:UIKeyboardAnimationCurveUserInfoKey];
[userInfo setObject:[NSNumber numberWithDouble:thisAnimDuration]
             forKey:UIKeyboardAnimationDurationUserInfoKey];

[[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification
                                                    object:nil
                                                  userInfo:userInfo];

Этот код работает, и я использую его в UIViewController подклассах.

Теперь, поскольку iPhone OS 3.0 , UITableViewController автоматически изменяет размер своего TableView, когда системные клавиатуры показывают и скрывают. Я только сейчас компилирую под 3.0, и я подумал, что контроллер должен также изменить размер таблицы, если появится моя пользовательская клавиатура, так как я публикую то же самое уведомление. Однако это не так. Контроллер табличного представления устанавливается как делегат полей ввода.

У кого-нибудь есть идея, почему это может иметь место? Кто-нибудь успешно реализовал нечто подобное?

У меня есть стандартные поля ввода вдоль пользовательских, поэтому, если пользователь меняет поля, стандартная клавиатура скрывает и показывает пользовательскую. Было бы полезно, если tableView не изменил размеры до полной высоты, и мне не пришлось изменять его размер обратно с помощью пользовательского метода.

Ответы [ 2 ]

0 голосов
/ 21 марта 2010

Ну, есть несколько возможностей, которые вы можете использовать. Из вашего описания кажется, что UITableView не использует уведомления UIKeyboard.

Но, возможно, именно UINavigationController отвечает на это уведомление (или UITabBarController).

Вы можете переопределить методы, такие как setFrame: drawRect: и setNeedsDisplay в табличном представлении, чтобы увидеть, что происходит в стеке вызовов. Возможно, вам удастся выяснить, что на самом деле вызывает перерисовку таблицы в правильном размере.

Но, по всей вероятности, простое изменение размера tableView - гораздо более простое решение. Эти предложения просто для удовольствия!

0 голосов
/ 20 марта 2010

Я сделал нечто подобное. Если я вспоминаю, я в итоге просто указал TableViewController на уведомления, которые вы отправляете или отправляете системой, а затем анимируете изменение фрейма табличного представления. Предположительно, что-то происходит внутри, но я думаю, что конечный результат просто превращается в два анимационных блока, обернутых вокруг друг друга, которые запускаются, когда система отправляет уведомления, но конечный результат должен быть одинаковым.

В вашем viewdidLoad:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillShow:) 
                                             name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillHide:) 
                                             name: UIKeyboardWillHidewNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidHideNotification object:nil];

и в контроллере вида:

-(void) keyboardWillShow:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your new size
}

-(void) keyboardDidShowOrHide:(id)sender {
  [UIView commitAnimations];
}

-(void) keyboardWillHide:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your old size
}
...