2013-01-24 47 views
0

当我在表格视图中添加一些隐藏的标题视图(如搜索栏)时,它会自动滚动到内容的顶部或表格单元格的顶部,当我将滚动的偏移量设置为搜索栏的中间位置时。 (我用下面的代码)如何实现tableheaderview的滚动过程?

// in viewDidLoad section 
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] 
[self.tableView setTableHeaderView:searchBar] 

// in viewWillAppear: section 
[self.tableView setContentOffset:CGPointMake(0, 44)]; 

例如,如果我向上滚动少量时的搜索栏是隐藏的,它会自动滚动以显示整个搜索栏。 如果在显示搜索栏时向下滚动一点,它会自动滚动以隐藏搜索栏。

我使用下面的代码来实现这个功能到我的集合视图的标题,但这不完全相同的表视图的功能。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    CGFloat offset = scrollView.contentOffset.y; 
    if (offset > 22 && offset < 44) { 
     [scrollView setContentOffset:CGPointMake(0, 44) animated:YES]; 
    } else if (offset > 44) { 
     return; 
    } else { 
     [scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
    } 
} 

我觉得这是很难完全模拟上述特征,因为显示整个搜索栏或隐藏搜索栏的判断是非常微妙的。

所以我的问题是,“在iOS SDK或UICollectionViewController中是否有预先实现的方法?”。

我搜索了好几个小时,但找不到答案。

回答

1

我找不到预先实现的方法来实现该功能,但下面的方式似乎使表面视图的东西类似。

首先,添加CGFloat type ivar originScrollOffset

然后,我使用下面的代码来实现滚动视图委托。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    originScrollOffset = scrollView.contentOffset.y; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    CGFloat endScrollOffset = scrollView.contentOffset.y; 
    NSLog(@"%f %f", originScrollOffset, endScrollOffset); 
    if (endScrollOffset <= 44 && endScrollOffset >= 0) { 
     if (originScrollOffset >= 44) { 
      if (originScrollOffset - endScrollOffset > 10) { 
       originScrollOffset = 0; 
       [self.collectionView setContentOffset:CGPointMake(0, 0) animated:YES]; 
      } else { 
       originScrollOffset = 44; 
       [self.collectionView setContentOffset:CGPointMake(0, 44) animated:YES]; 
      } 
     } else { 
      if (endScrollOffset - originScrollOffset > 10) { 
       originScrollOffset = 44; 
       [self.collectionView setContentOffset:CGPointMake(0, 44) animated:YES]; 
      } else { 
       originScrollOffset = 0; 
       [self.collectionView setContentOffset:CGPointMake(0, 0) animated:YES]; 
      } 
     } 
    } 
}