19

表示されているすべてのセクション ヘッダー ビューを取得する方法はありますか?

UITableView の visibleCells インスタンス メソッドに似たもの..

4

10 に答える 10

20

indexPathsForVisibleRows を使用する際の問題は、行のないセクションが含まれないことです。空のセクションを含むすべての可視セクションを取得するには、セクションの四角形をチェックし、それをテーブルの contentOffset と比較する必要があります。

また、フローティング セクションのあるプレーン スタイルと、フローティング セクションのないグループ化されたスタイルの違いにも注意する必要があります。

この計算をサポートするカテゴリを作成しました。

@interface UITableView (VisibleSections)

// Returns an array of NSNumbers of the current visible section indexes
- (NSArray *)indexesOfVisibleSections;
// Returns an array of UITableViewHeaderFooterView objects of the current visible section headers
- (NSArray *)visibleSections;

@end

@implementation UITableView (VisibleSections)

- (NSArray *)indexesOfVisibleSections {
    // Note: We can't just use indexPathsForVisibleRows, since it won't return index paths for empty sections.
    NSMutableArray *visibleSectionIndexes = [NSMutableArray arrayWithCapacity:self.numberOfSections];
    for (int i = 0; i < self.numberOfSections; i++) {
        CGRect headerRect;
        // In plain style, the section headers are floating on the top, so the section header is visible if any part of the section's rect is still visible.
        // In grouped style, the section headers are not floating, so the section header is only visible if it's actualy rect is visible.
        if (self.style == UITableViewStylePlain) {
            headerRect = [self rectForSection:i];
        } else {
            headerRect = [self rectForHeaderInSection:i];
        }
        // The "visible part" of the tableView is based on the content offset and the tableView's size.
        CGRect visiblePartOfTableView = CGRectMake(self.contentOffset.x, self.contentOffset.y, self.bounds.size.width, self.bounds.size.height);
        if (CGRectIntersectsRect(visiblePartOfTableView, headerRect)) {
            [visibleSectionIndexes addObject:@(i)];
        }
    }
    return visibleSectionIndexes;
}

- (NSArray *)visibleSections {
    NSMutableArray *visibleSects = [NSMutableArray arrayWithCapacity:self.numberOfSections];
    for (NSNumber *sectionIndex in self.indexesOfVisibleSections) {
        UITableViewHeaderFooterView *sectionHeader = [self headerViewForSection:sectionIndex.intValue];
        [visibleSects addObject:sectionHeader];
    }

    return visibleSects;
}

@end
于 2014-05-08T09:37:09.317 に答える
4

プレーンスタイルのテーブルの場合、表示される行を取得できます。それらから、表示されているセクションのセットを取得します。そして、そこから、テーブルからセクションヘッダービューを取得します。

NSArray *visibleRows = [self.tableView indexPathsForVisibleRows];
NSMutableIndexSet *sections = [[NSMutableIndexSet alloc] init];
for (NSIndexPath *indexPath in visibleRows) {
    [sections addIndex:indexPath.section];
}

NSMutableArray *headerViews = [NSMutableArray array];
[sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
    UIView *view = [self.tableView headerViewForSection:idx];
    [headerViews addObject:view];
}];

注:コードはテストされていません-タイプミスが含まれている可能性があります。これは、グループ化されたスタイルのテーブルでは100%機能しません。

于 2013-03-04T15:00:25.357 に答える
1

現在表示されているセクションを取得するには、現在表示されているセルの indexpath セクションをチェックすることで取得できるため、この関数は表示されているセクションを返すことができます

- (NSArray *)indexesOfVisibleSections {

    NSMutableArray *visibleSections = [NSMutableArray array];

    for (UITableViewCell * cell in [self.tableView visibleCells]) {
        if (![visibleSections containsObject:[NSNumber numberWithInteger:[self.tableView indexPathForCell:cell].section]]) {
            [visibleSections addObject:[NSNumber numberWithInteger:[self.tableView indexPathForCell:cell].section]];
        }
    }

    return visibleSections;
}

断面図にアクセスするには、次を使用できます

- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section;
于 2015-12-31T20:50:40.673 に答える
1

この場合、 をcell.tag現在のセクション ( indexPath.section) に設定し、 およびで説明した方法をcellForRowAtIndexPath使用すると思います。visibleCellsheaderViewForSection

于 2013-03-04T15:19:46.183 に答える