1

在 iPhone 应用程序上,我有一个自定义键盘,其工作方式与标准键盘类似;如果自定义文本字段成为第一响应者,它就会出现,如果该字段退出第一响应者,它就会隐藏。我还发布了 Generic及其隐藏的对应项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 没有调整到全高并且我不必使用自定义方法将其调整回大小,那将是有益的。

4

2 回答 2

0

我做过类似的事情。如果我记得,我最终只是让 TableViewController 成为您发送或系统发送的通知的子目录,然后将更改动画到 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
}
于 2010-03-20T01:27:47.060 回答
0

好吧,您有几种可能性。根据您的描述,UITableView 似乎没有使用 UIKeyboard 通知。

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

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

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

于 2010-03-21T01:20:17.977 回答