UITableView 在滚动时重置 ContentOffset
Posted
技术标签:
【中文标题】UITableView 在滚动时重置 ContentOffset【英文标题】:UITableView reset ContentOffset when scrolling 【发布时间】:2014-12-02 14:06:17 【问题描述】:我在 UIViewController 中有一个 UITableView 作为子视图。当用户按下tableView下的UITextfield时,我设置了键盘出现时tableView的contentOffset。如果我滚动 1 点(向上/向下),表格视图会将其 contentOffset 重置为默认值。我确定我没有在代码中的任何地方将 contentOffset 重置为零。为什么会这样? 这是我设置 ContentOffset 的方式:
CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
[_tableView setContentOffset:CGPointMake(0, keyboardEndFrame.size.height) animated:YES];
【问题讨论】:
您是否也将UITableView
的底部填充设置为与键盘一样高?要么这样,要么调整UITableView
的大小,使其在键盘开始的地方结束......如果你不这样做,表格视图将在技术上滚动通过它的底部,所以用手指滚动它会导致它重置滚动位置...
@jjv360 不,我不这样做。如何添加底部填充?
【参考方案1】:
要向 UITableView 添加填充以便其内容可以在键盘上方滚动,您可以执行以下操作:
-(void) keyboardMoved:(NSNotification*)notify
// Get values
CGRect endFrame;
[[[notify userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&endFrame];
endFrame = [self.view convertRect:endFrame fromView:nil];
// Add padding
int inset = self.view.bounds.size.height - endFrame.origin.y;
tableView.contentInset = UIEdgeInsetsMake(0, 0, inset < 0 ? 0 : inset, 0);
tableView.scrollIndicatorInsets = tableView.contentInset;
【讨论】:
谢谢,它正在工作!我想补充一点,如果 ViewController 出现时有隐藏的 tabBar,我们应该在 inset 中添加 44。【参考方案2】:问题是你没有调整内容大小,基本上例如:
你有 uiTableView,它的大小为 320 * 400 和相同的内容大小,你显示键盘并设置内容偏移量,但不改变内容大小(我的意思是你设置了不可能的偏移量),然后你开始滚动,你的表格滚动可能的偏移值,在这种情况下,您需要增加内容大小。但是对于 tableView 更好的是添加 contentInset 和计算的底部插图。
【讨论】:
以上是关于UITableView 在滚动时重置 ContentOffset的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 滚动后 UITableView contentOffset 重置
将 TableView 标题粘贴到顶部,导致当用户向下滚动时标题不“交互”