1. 程式人生 > >UITableView-獲取最上面懸停的"SectionView"

UITableView-獲取最上面懸停的"SectionView"

Demo地址(有拓展喲)(PS:今天有點累.明天更新一下部落格)

我一開始的思路和這一篇文章差不多.大致思路是通過顯示組頭.將要顯示組頭的UITableView代理方法來判斷最上層是哪個組頭.思路是沒有錯誤的,但是試玩了一下.在兩個組切換之間.不鬆手的上下滑動會有BUG(具體表現為當前顯示組頭一直+1,+1,+1).

{   
    //使用currentTopSectionViewCount記錄當前顯示的最上層的Section.在控制器中初始化為0.
    long _currentTopSectionViewCount;
}

最主要的是所有UIScrollView以及繼承與UISCrollView子控制元件的已經滾動的代理.
以及當前顯示的”Cells”.通過- (UITableViewCell *)visibleCells;

來呼叫.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (scrollView == self.tableView) {
        NSArray <ZGAccountsBookDataTableViewCell *> *cellArray = [self.tableView  visibleCells];
        //cell的section的最小值
        long cellSectionMINCount = LONG_MAX;
        for (int i = 0; i < cellArray.count
; i++) { ZGAccountsBookDataTableViewCell *cell = cellArray[i]; long cellSection = [self.tableView indexPathForCell:cell].section; if (cellSection < cellSectionMINCount) { cellSectionMINCount = cellSection; } } _currentTopSectionViewCount = cellSectionMINCount; NSLog
(@"當前懸停的組頭是:%ld",_currentTopSectionViewCount); } }

我們可以使用UITableView的

- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0); 

方法來取到組頭或者是組尾試圖.

一般來說,小夥伴們一半肯定是建立一個UIView然後直接返回作為每一組的組頭或者組尾試圖.那麼,大家看到上面的這個方法有沒有想到那個返回值是UITableViewHeaderFooterView.

而UITableViewHeaderFooterView中第一個(一般最重要的東西都是放在最上面的)方法就是

- (instancetype)initWithReuseIdentifier:(nullable NSString *)reuseIdentifier NS_DESIGNATED_INITIALIZER;

看到Identifier是否能夠聯想到UITableView的Indentifier呢.registerclass的時候不知道大家是否注意到了有個headerFooter:
這裡寫圖片描述

既然註冊View和Cell的方式一樣,那麼取的時候也應該和Cell的方式一樣:

/*
 *這裡只是拿HeaderView舉個例子.如果大家要看footerView那麼可以重寫另外一個方法
 *viewForFooterInSection
 */
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    TableViewSectionHeaderView *headerView = (TableViewSectionHeaderView *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:tableHeaderViewID];
    //結合上面的_currentTopSectionViewCount.我們可以在這裡對最上面的組頭做一些設定.

    return headerView;
}