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

时间:2012-04-18 14:47:05

标签: objective-c ios uitableview uiscrollview uiviewanimation

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

1 个答案:

答案 0 :(得分: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];
    }
}

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

用几句话来解释contentInsetCGPoint,这让我花了一些时间来理解它们的含义。

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

我希望有所帮助。 :)