2010-03-12 2 views
1

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

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 не изменил размер до полной высоты, и мне не пришлось изменять его размер с помощью настраиваемого метода.

ответ

0

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

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

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

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

+0

Да, я вижу, это то, что я должен сделать, чтобы найти решение (я в настоящее время в дороге), и если я не найду что-то, что я могу подключить, я просто разрешу его вручную. Значит, я вознагражу щедрость вам. :) – Pascal

0

я сделал что-то подобное. Если я помню, у меня получилось, что подэлемент 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 
} 
+0

Вот как я делаю это в своих настраиваемых контроллерах представлений, я хотел избежать этого и подключиться к стандартным механизмам 'UITableViewController'. Кстати, есть ли особая причина, почему вы ждете, чтобы зафиксировать анимацию, пока клавиатураDidShowOrHide :? – Pascal

+0

Честно говоря, я не знаю, почему я ждал, я смутно помню, что * был * причина, почему в то время, но я написал этот код 2 года назад, и какой-либо причине существовали тогда больше не может быть уместным. У меня есть подозрение, что стандартный механизм, который UITAbleViewController использует сейчас, включает вызов метода к чему-то недокументированному, который всегда может быть больным при работе на этой платформе. –

+0

Ах, да, это имеет смысл, OS 2.x потребовалось много хаков здесь и там. :) – Pascal

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