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 自定义为“@”和“#”?