UIKeyboard 可见时如何更改 UITableView 的大小?

Posted

技术标签:

【中文标题】UIKeyboard 可见时如何更改 UITableView 的大小?【英文标题】:How to change UITableView size when UIKeyboard is visible? 【发布时间】:2014-02-08 06:53:43 【问题描述】:

我有一个带有 UITableView 的应用程序,它在 UITableViewCells 内有 UITextFields,用户将连接虚拟 UIKeyboard 或蓝牙键盘以将文本输入到 UITextFields。

如果蓝牙键盘已连接,我希望在选择和输入文本时保持 UITableView 全高。当没有连接蓝牙键盘时,如果它可见我想缩小 UITableview 以适应 UIkeyboard 正在显示,如果它没有显示那么我想再次使 UITableView 全尺寸。

我已经尝试通过使用 UIKeyboard 委托方法来做到这一点

- (void)keyboardDidShow:(NSNotification *)aNotification;
- (void)keyboardDidHide:(NSNotification *)aNotification;

由于某种原因,keyboardDidShow 从未被访问过,但是当 UIKeyboard 从视图中移除时,keyboardDidHide 被访问,我不知道为什么。

【问题讨论】:

【参考方案1】:
- (void)keyboardDidShow:(NSNotification *)aNotification;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];
    self.tblView.frame = CGRectMake(0, height, self.view.frame.size.width, self.view.frame.size.height - 255); // or -216
    [UIView commitAnimations];


- (void)keyboardDidHide:(NSNotification *)aNotification;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.2f];
    self.tblView.frame = CGRectMake(0, height, self.view.frame.size.width, self.view.frame.size.height - height);
    [UIView commitAnimations];

UITextField 委托方法中

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
   
    CGRect rc = [textField bounds];
    rc = [textField convertRect:rc toView:self.tblView];
    CGPoint pt = rc.origin;
    pt.x = 0;
    if(rc.origin.y > 200)
        pt.y -=  150;
    else
        pt.y -= rc.origin.y;
    [self.tblView setContentOffset:pt animated:YES];

    return YES;


- (BOOL)textFieldShouldReturn:(UITextField *)textField

    [textField resignFirstResponder];
    return YES;

【讨论】:

好的,所以这适用于输入时的视图滚动,但是keyboardDidShow方法仍然没有被使用......我不知道为什么。我在那里放了一个断点,它永远不会被击中。 需要添加观察者 **[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; **【参考方案2】:

像这样使用优化的方式

selectRowAtIndexPath:animated:scrollPosition:

在接收器中选择由索引路径标识的一行,可选择将该行滚动到接收器中的某个位置。

- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition

特殊注意事项 传递 UITableViewScrollPositionNone 将导致不滚动,而不是为该常量描述的最小滚动。要以最小滚动滚动到新选择的行,请使用此方法与 UITableViewScrollPositionNone 选择行,然后调用 scrollToRowAtIndexPath:atScrollPosition:animated: 与 UITableViewScrollPositionNone。

NSIndexPath *rowToSelect;  // assume this exists and is set properly
UITableView *myTableView;  // assume this exists

[myTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone];
[myTableView scrollToRowAtIndexPath:rowToSelect atScrollPosition:UITableViewScrollPositionNone animated:YES];

更多了解Setting scroll position in UITableView

【讨论】:

以上是关于UIKeyboard 可见时如何更改 UITableView 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

点击 UITextField 时没有出现 UIKeyboard

用户点击 UIKeyboard 中的完成按钮时未调用 textFieldShouldEndEditing

Instagram 如何将 UIKeyboard returnKey 自定义为“@”和“#”?

UIButton iOS 7 跟随 UIKeyboard 动画

设置 UIKeyboard 附件视图时遇到问题

当我在 UITextField 中快速点击时,为啥 UIKeyboard 不出现?