2010-03-12 82 views
1

在iPhone应用程序中,我有一个自定义键盘,它与标准键盘一样工作;它会出现,如果自定义文本字段成为第一响应者,并隐藏,如果该字段辞职第一响应者。我还张贴通用UIKeyboardWillShowNotificationUIKeyboardDidShowNotification和他们的藏身同行,就像如下:自定义键盘(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通知。

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

您可以在tableview中覆盖诸如setFrame:drawRect:和setNeedsDisplay之类的方法来查看调用堆栈中发生了什么。您可能能够找出实际导致tableview以正确大小重绘的内容。

但是很可能,仅仅改变tableView的大小本身就是更简单的解决方案。这些建议只是为了好玩!

+0

是的,我看到这是我为了找到解决方案(目前正在路上)所必须做的,如果我没有找到可以挂钩的东西,我只会手动解决它。意味着我会奖励你的赏金。 :) – Pascal 2010-03-24 10:12:53

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 
} 
+0

这就是我在自定义视图控制器中的做法,我想避免这种情况并插入'UITableViewController'的标准机制。顺便说一句,是否有一个特别的原因,你为什么要等到提交动画直到keyboardDidShowOrHide:? – Pascal 2010-03-20 21:00:30

+0

老实说,我不知道为什么我等了,我依稀记得那是*为什么在那个时候,但是我在2年前写了这个代码,并且存在的任何理由都可能不再相关。我怀疑UITAbleViewController现在使用的标准机制涉及到一个方法调用某些未记录的东西,在这个平台上工作时总是会很痛苦。 – 2010-03-21 23:00:05

+0

啊,是的,这是有道理的,操作系统2。x在这里和那里需要大量的黑客。 :) – Pascal 2010-03-25 08:46:24