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

自定义键盘(iPhone)、UIKeyboardDidShowNotification和UITableViewController,iphone,cocoa-touch,uikit,uikeyboard,nsnotification,Iphone,Cocoa Touch,Uikit,Uikeyboard,Nsnotification,在iPhone应用程序上,我有一个自定义键盘,它的工作原理与标准键盘类似;如果自定义文本字段成为第一响应者,则显示该字段;如果该字段退出第一响应者,则隐藏该字段。我还发布了通用的UIKeyboardWillShowNotification,UIKeyboardDidShowNotification及其隐藏对应项,如下所示: NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:5]; [userIn

在iPhone应用程序上,我有一个自定义键盘,它的工作原理与标准键盘类似;如果自定义文本字段成为第一响应者,则显示该字段;如果该字段退出第一响应者,则隐藏该字段。我还发布了通用的
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 OS3.0
UITableViewController
会在系统键盘显示和隐藏时自动调整其tableView的大小。我现在只是针对3.0进行编译,我认为如果出现我的自定义键盘,控制器也应该调整表的大小,因为我发布了相同的通知。但事实并非如此。表视图控制器设置为输入字段的委托

有人知道为什么会这样吗?有人成功地实现了类似的功能吗


我有标准输入字段和自定义字段,因此如果用户更改字段,标准键盘将隐藏,自定义键盘将显示。如果tableView不调整到全高,我也不必用自定义方法重新调整它的大小,这将是有益的。

我也做过类似的事情。如果我还记得的话,我最终只是让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
}

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

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

您可以在tableview中重写setFrame:drawRect:和setNeedsDisplay等方法,以查看调用堆栈中发生的情况。您可以找出导致tableview以正确大小重新绘制的实际原因


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

我在自定义视图控制器中就是这样做的,我希望避免这种情况,并插入标准机制
UITableViewController
。顺便说一句,有没有一个特别的原因让你等到keyboardDidShowOrHide才提交动画:?老实说,我不知道我为什么要等,我模糊地记得当时有一个原因,但我在两年前写了这段代码,当时存在的任何原因都可能不再相关。我暗自怀疑,UITAbleViewController现在使用的标准机制涉及到对未记录的东西的方法调用,这在这个平台上工作时总是一件痛苦的事情。啊,是的,这是有道理的,OS 2.x需要在这里和那里进行大量的黑客攻击。:)是的,我知道这是我必须做的,以找到解决方案(我目前正在路上),如果我没有找到什么我可以钩在我会只是解决它手动。意思是我会把赏金赏给你。:)