以与Mail应用程序相同的方式显示/隐藏UITableView标头(UITextField)

时间:2011-06-01 23:28:32

标签: iphone cocoa-touch

我想以与标准Mail应用程序的UISearchBar完全相同的方式显示和隐藏UITableView标头(UITextField),但是无法弄清楚如何实现该行为。

与我相关的行为如下:

  • 首次显示时,隐藏标题(搜索栏)。
  • 当用户向下滚动时,会显示标题。
  • 即使表格内容(行)没有填满整个表格视图,标题也可以滚动回到视线之外(非常重要)。
  • 在返回同一视图时,标题的位置正好是它所在的位置(完全在视图中,完全在视图之外,或介于两者之间)。

即使表格内容(行)没有填满整个视图,关键是能够将标题回滚到视线之外。

我已经尝试过设置contentOffset,虽然我可以通过这样做隐藏第一个视图的标题,但是当表内容(行)没有填满整个表格视图时,标题无法向后滚动这种方法。

有人可以提供任何建议吗?

1 个答案:

答案 0 :(得分:0)

你有没有得到你想要的东西?我从一段时间以来的代码中得到了这个,这就是你所要求的。下拉40px时,在标题中显示搜索栏。当桌面向上滚动40px时隐藏在导航栏下。

搜索是我在搜索栏处于活动状态时设置的iVar标志。

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    CGFloat amountOfDrag = scrollView.contentOffset.y;
    UIEdgeInsets edgeAtEntry = self.tableView.contentInset;
    UIEdgeInsets edgeSetNew;
    CGFloat underlay = self.topLayoutGuide.length;
    CGFloat searchBarViewHeight = 44.0f;
    BOOL needsReset = NO;
    if (amountOfDrag <= -40 && edgeAtEntry.top == underlay - searchBarViewHeight) {
        needsReset = YES;
        edgeSetNew = UIEdgeInsetsMake(0.0f + underlay, 0.0f, self.bottomLayoutGuide.length, 0.0f);
    } else if (amountOfDrag >= 40 && edgeAtEntry.top != underlay - searchBarViewHeight) {
        needsReset = YES;
        edgeSetNew = UIEdgeInsetsMake(-searchBarViewHeight + underlay, 0.0f, self.bottomLayoutGuide.length, 0.0f); //hides searchbar under navbar
    }

    if (needsReset && !searching) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.2];
        scrollView.contentInset = edgeSetNew;
        [UIView commitAnimations];
    }
}