0

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

4

1 回答 1

0

在 Google 和 StackOverFlow 上进行广泛搜索后,我找到了正确的线索: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];
    }
}

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

几句话来解释contentOffsetand contentInset,我花了一段时间才理解它们的意思。

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

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

于 2012-05-03T18:28:01.480 回答