触发 UITextField 时同步向上滑动 UIView 并调整 UITableView 的大小

Posted

技术标签:

【中文标题】触发 UITextField 时同步向上滑动 UIView 并调整 UITableView 的大小【英文标题】:Synchronously slide up UIView and resize UITableView when UITextField is fired 【发布时间】:2012-02-05 18:55:54 【问题描述】:

我会调整UITableView 的大小并在触发此字段时向上滑动包含UITextFieldUIView。这是两个简单的模型:

现在我有了这个代码:

- (void)textFieldDidBeginEditing:(UITextField *)textField

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [myView setFrame:CGRectMake(myView.frame.origin.x, myView.frame.origin.y - 167, myView.frame.size.width, myView.frame.size.height)]; // 216 (keyboard's height) - 49 (tabbar's height) = 167

    [UIView commitAnimations];


- (BOOL)textFieldShouldReturn:(UITextField *)textField

    [textField resignFirstResponder];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [myView setFrame:CGRectMake(myView.frame.origin.x, myView.frame.origin.y + 167, myView.frame.size.width, myView.frame.size.height)];

    [UIView commitAnimations];
    return TRUE;

问题是键盘上滑动画和myView上滑动画不同步。如何让这两个动画完美同步?

以及如何在键盘可见时调整UITableView的大小并在键盘隐藏时返回原始高度?

【问题讨论】:

Keeping object on top of keyboard in the event of becomeFirstResponder or resignFirstResponder?的可能重复 如何将底部显示的 UIView 用作 tableFooterView。如果现在将所有这些都包装到 UITableViewController 中,您就可以免费获得所需的功能。 @till no 因为我希望 UIView 始终可见。 @FredCollins 好点,那是行不通的。实际上,节页脚适用于这种情况,不是吗? 可能不会。顺便说一句,我以一种很好的方式解决了我的问题。查看答案。 【参考方案1】:

简短的回答是您需要订阅UIKeyboardWillShowNotificationUIKeyboardWillHideNotification。这些通知包含键盘动画的确切参数。

长答案是https://***.com/a/8704371/77567。

关于您的标签栏:我链接的答案假设您希望在关闭键盘时将视图向下滑动到屏幕的底部边缘。由于您想将其向下滑动到标签栏的边缘,因此您需要查看键盘是隐藏还是显示(通过检查note.name)。如果它正在显示,您应该将视图的当前帧保存在实例变量中。如果它被隐藏,您应该将视图的新框架设置为您保存在实例变量中的那个框架,而不是根据键盘的结束框架来设置它。

【讨论】:

感谢您的回答。当键盘将显示并且字段向上滑动时,该代码运行良好,但当键盘将隐藏并且字段向下滑动时则不起作用。具体来说,当字段向下滑动时,它在origin.y = 363处滑动,它会被UITabBar隐藏起来(高度为49)。 CGRect keyboardFrameForTextField = [self.commentView.superview convertRect:keyboardFrame fromView:nil]; 到底如何?你知道如何修复标签栏吗?

以上是关于触发 UITextField 时同步向上滑动 UIView 并调整 UITableView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

UITextField - 当应用程序来自后台时键盘不隐藏

当 UITextField 的“editingDidBegin”控件事件触发时,将 UITextField 的当前值设置为一个属性

UITableView:向上滑动时收缩标签栏和导航栏

背景颜色属性向上滑动

Hover/mouseenter 事件反复触发 jQuery UI 的“动画”

你可以检测到向上滑动Android头部通知