自定义键盘(iPhone)、UIKeyboardDidShowNotification和UITableViewController
在iPhone应用程序上,我有一个自定义键盘,它的工作原理与标准键盘类似;如果自定义文本字段成为第一响应者,则显示该字段;如果该字段退出第一响应者,则隐藏该字段。我还发布了通用的自定义键盘(iPhone)、UIKeyboardDidShowNotification和UITableViewController,iphone,cocoa-touch,uikit,uikeyboard,nsnotification,Iphone,Cocoa Touch,Uikit,Uikeyboard,Nsnotification,在iPhone应用程序上,我有一个自定义键盘,它的工作原理与标准键盘类似;如果自定义文本字段成为第一响应者,则显示该字段;如果该字段退出第一响应者,则隐藏该字段。我还发布了通用的UIKeyboardWillShowNotification,UIKeyboardDidShowNotification及其隐藏对应项,如下所示: NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:5]; [userIn
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需要在这里和那里进行大量的黑客攻击。:)是的,我知道这是我必须做的,以找到解决方案(我目前正在路上),如果我没有找到什么我可以钩在我会只是解决它手动。意思是我会把赏金赏给你。:)