我一直这样做。我这样做的方式是我有一个在 UIControlEventEditingDidBegin 中为文本字段调用的方法,在该方法中,我这样做:
-(void)startEdit:(UITextField *)textField {
self.prevOffset = self.tableView.contentOffset.y; //I like storing the current offset so I can restore it when the text stops editing, you don't have to do this.
int offSet = [textField superview].frame.origin.y; //this gets the y coordinate of the cell the textField is in. If the table is not at 0,0, you also need to add [[textField superview] superview].frame.origin.y;
offSet-=(self.view.frame.size.height-KEYBOARD_HEIGHT)/2; //where KEYBOARD_HEIGHT is 216 in portrait and 160 in landscape;
if (offSet<0) offSet = 0;
[UIView animateWithDuration:0.3 animations:^{
[self.tableView setContentOffset:CGPointMake(0,offSet)];}];
}
我也做很多其他事情,但我相信它们是针对我的应用程序的。
首先,如果偏移量大于 0,我将 contentInset 设置为 UIEdgeInsetsMake(0,0,KEYBOARD_HEIGHT,0),因为在此之前我有一些跳跃的滚动视图。
此外,如果原始偏移量(self.prevOffset)加上框架的高度大于内容大小(这也会导致跳跃,因为它将偏移量设置得太低然后跳回来),我将 prevOffset 设置为 MAX(0,contentSize.高度框架.大小.高度)。
这些东西不是必需的,但是你会得到跳跃的滚动/表格视图,试试看。