【问题标题】:Custom Keyboard (iPhone), UIKeyboardDidShowNotification and UITableViewController自定义键盘 (iPhone)、UIKeyboardDidShowNotification 和 UITableViewController
【发布时间】:2010-03-12 16:49:59
【问题描述】:

在 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 没有调整到全高并且我不必使用自定义方法将其调整回大小,那将是有益的。

【问题讨论】:

    标签: iphone cocoa-touch uikit uikeyboard nsnotification


    【解决方案1】:

    嗯,有几种可能性可供您参考。根据您的描述,UITableView 似乎没有使用 UIKeyboard 通知。

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

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

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

    【讨论】:

    • 是的,我知道这是我必须做的才能找到解决方案(我目前正在路上),如果我没有找到可以挂钩的东西,我会解决它手动。意思是我会把赏金奖励给你。 :)
    【解决方案2】:

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

    【讨论】:

    • 这就是我在自定义视图控制器中的做法,我想避免这种情况并插入UITableViewController 的标准机制。顺便说一句,您是否有特殊原因要等到 keyboardDidShowOrHide: 才提交动画?
    • 老实说,我不知道我为什么要等,我依稀记得当时有 一个原因,但我在 2 年前写了这段代码,当时有什么原因可能不再相关。我偷偷怀疑 UITableViewController 现在使用的标准机制涉及对未记录内容的方法调用,这在此平台上工作时总是很痛苦。
    • 啊,是的,这是有道理的,OS 2.x 在这里和那里需要大量的 hack。 :)
    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多