2013-01-24 84 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]; 
      } 
     } 
    } 
}