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的主要内容,如果未能解决你的问题,请参考以下文章

滚动 UITableView 期间计时器将重置并停止运行

UITableViewCell 的背景设置在滚动时重置

UIScrollView 滚动后 UITableView contentOffset 重置

将 TableView 标题粘贴到顶部,导致当用户向下滚动时标题不“交互”

滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改

如何使用 swift 重置 UICollectionView 滚动位置?