我在视图中有一个嵌入式表格视图。这个嵌入式表格视图的顶行始终可见,即使使用键盘也是如此。如果您在下部单元格中输入某些内容,我希望它们向上滚动(像往常一样)以查看您在文本字段中输入的内容。然而这并没有发生,它们仍然隐藏在键盘后面。我怎样才能改变这个?
谢谢迈克尔
您不会免费获得这种行为,您需要自己向上/向下滚动内容。AUITableView
继承自 a UIScrollView
,因此滚动不是实际问题。要滚动,您可以设置其contentSize
和contentOffset
(如果您愿意,甚至可以设置动画)。
第一件事是,您想收听这些通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
这些将告诉您键盘是显示还是隐藏。在每种方法中,相应地更改您的contentOffset
and :contentSize
UITableView
- (void)keyboardWillShow:(NSNotification *)notification
{
// keyboard info
NSDictionary *userInfo = [notification userInfo];
CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
UIViewAnimationOptions animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// offsets
UIView *cell = myTextField.superView; // assuming your text field is a direct child of the UITableViewCell
CGFloat textFieldBottomY = self.view.frame.origin.y + myTableView.frame.origin.y - myTableView.contentOffset.y + cell.frame.origin.y + myTextField.origin.y + myTextField.frame.size.height;
CGFloat keyboardTopY = keyboardRect.origin.y;
// new content size: add size to be able to scroll
originalContentOffset = myTableView.contentOffset; // store the original content offset to set back when keyboard hides
originalContentSize = myTableView.contentSize; // store the original content size to set back when keyboard hides
CGSize newContentSize = myTableView.contentSize;
newContentSize.height += keyboardRect.size.height;
myTableView.contentSize = newContentSize;
// scroll to just beneath your text field
[UIView animateWithDuration:animationDuration delay:0 options:animationCurve animations:^{
myTableView.contentOffset = CGPointMake(0, textFieldBottomY - keyboardTopY);
} completion:NULL];
}
重置一切:
- (void)keyboardWillHide:(NSNotification *)notification
{
// keyboard info
NSDictionary *userInfo = [notification userInfo];
UIViewAnimationOptions animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// move content
[UIView animateWithDuration:animationDuration delay:0 options:animationCurve animations:^{
myTableView.contentOffset = originalContentOffset;
} completion:^(BOOL finished) {
if (finished) {
// reset content size
myTableView.contentSize = originalContentSize;
}
}];
}
要检测选择/激活哪个文本字段:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
myTextField = textField;
}
我没有在 a 上测试代码UITableView
,但我最近在 a 上使用了它UIScrollView
。再次 - 由于 aUITableView
继承自 a UIScrollVIew
,这应该不是问题。如果表格视图没有正确滚动到文本字段下方,则 的值textFieldBottomY
不正确。
这是一个链接,其中包含实现此目的的详细说明。它解释了方法UIScrollView
,它也将起作用UITableView
。
如果您使用 aUITableViewController
而不是手动添加UITableView
视图,您将自动获得该行为。
您必须滚动到 TextField 和 Tableview 之间的位置,检查这个答案。