自定义键盘(iPhone),UIKeyboardDidShowNotification和UITableViewController

时间:2010-03-12 16:49:59

标签: iphone cocoa-touch uikit uikeyboard nsnotification

在iPhone应用程序上,我有一个自定义键盘,就像标准键盘一样;如果自定义文本字段成为第一响应者,则显示该字段并且如果该字段辞职第一响应者则隐藏。我还发布了通用UIKeyboardWillShowNotificationUIKeyboardDidShowNotification及其隐藏对应方,如下所示:

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 :(得分:0)

我做了类似的事情。如果我记得,我最终只是将TableViewController subecibe发送到您发送或系统发送的通知,然后将更改设置为tableview框架的动画。据推测,内部有类似的东西,但我认为最终结果只是两个动画块相互缠绕,它们都在系统发布通知时运行,但最终结果应该是相同的。

在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
}

答案 1 :(得分:0)

嗯,你可能会有一些可能性。根据你的描述,似乎UITableView没有使用UIKeyboard通知。

但可能是UINavigationController响应此通知(或UITabBarController)。

您可以在tableview中覆盖setFrame:drawRect:和setNeedsDisplay等方法,以查看调用堆栈中发生的情况。您可以弄清楚究竟是什么导致tableview以正确的大小重绘。

但很有可能,只是自己更改tableView的大小是更容易的解决方案。这些建议只是为了好玩!