如何防止行动画向下滚动 TableHeaderView?

Posted

技术标签:

【中文标题】如何防止行动画向下滚动 TableHeaderView?【英文标题】:How can I prevent row animations from scrolling down my TableHeaderView? 【发布时间】:2012-04-18 14:47:05 【问题描述】:

我的表格的标题视图中有一个 UISearchBar。每当动画发生时,例如删除或插入行时,标题视图会向下滚动。有没有办法告诉表格视图,它不应该(自动)向下滚动标题视图? (只有用户才能向下滑动。)

【问题讨论】:

【参考方案1】:

在 Google 和 *** 上进行广泛搜索后,我找到了正确的线索:UIScrollView。我一直在寻找并最终实现的实际解决方案可以在另一个问题中找到:Change Default Scrolling Behavior of UITableView Section Header

我稍微定制了解决方案,使其具有以下属性:

行动画可能会向下滚动表格视图,除非显示标题视图 单击顶部(“滚动到顶部”)应将表格视图滚动到顶部,不包括标题视图 如果标题视图部分可见,则它应该向下滑动,使其完全可见

此解决方案的代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    CGFloat searchBarHeight = self.searchBar.frame.size.height;
    if (scrollView.contentOffset.y >= searchBarHeight) 
        scrollView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0);
     else 
        scrollView.contentInset = UIEdgeInsetsZero;
    


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

    if (scrollView.contentOffset.y < self.searchBar.frame.size.height && scrollView.contentOffset.y > 0) 
        [scrollView setContentOffset:CGPointZero animated:YES];
    

此代码在UITableViewController 中实现,它充当UITableView 的委托。另一边的UITableView 继承自UIScrollView,这使得这些方法可用并执行所有魔法。

几句话解释contentOffsetcontentInset,我花了一段时间才明白它们的意思。

偏移量是CGPoint,它只是告诉可见内容,即表格视图的部分和单元格从左上角向下滚动的距离。包含页眉视图和页脚视图,因此 (0, 0) 的偏移量表示表格视图滚动到顶部。 (0, 100) 的偏移量表示表格视图向下滚动了 100 像素(通常不使用点的 x 值)。 插图是一个非常有趣的属性,它将UIScrollView 的边界定义为四元(top, left, bottom, right)。因此,如果您越过这些边界,表格视图将会反弹。默认值为 (0, 0, 0, 0),这意味着如果您在其第一个/最后一个单元格的上方/下方滚动,表格视图将反弹。因此 (-44, 0, 0, 0) 的值会将反弹边界降低到表格视图原点以下 44 像素。由于我的标题视图是 44px 高,每次你将标题视图滚动到屏幕的可见部分时,它都会反弹。这也可以防止行动画将表格滑动到偏移量 (44, 0) 以下,并且“滑动到顶部”命令会将表格视图滑动到偏移量 (44, 0)。

我希望这会有所帮助。 :)

【讨论】:

以上是关于如何防止行动画向下滚动 TableHeaderView?的主要内容,如果未能解决你的问题,请参考以下文章

添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

如何防止用户滚动超过某个点?

UITableView 行动画持续时间和完成回调

粘性侧边栏:向下滚动时固定在底部,向上滚动时固定在顶部

如何防止 TextEditor 在 SwiftUI 中滚动?

如何防止滚动使用jquery跳过列表中的项目?