表示されているすべてのセクション ヘッダー ビューを取得する方法はありますか?
UITableView の visibleCells インスタンス メソッドに似たもの..
表示されているすべてのセクション ヘッダー ビューを取得する方法はありますか?
UITableView の visibleCells インスタンス メソッドに似たもの..
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
プレーンスタイルのテーブルの場合、表示される行を取得できます。それらから、表示されているセクションのセットを取得します。そして、そこから、テーブルからセクションヘッダービューを取得します。
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%機能しません。
現在表示されているセクションを取得するには、現在表示されているセルの 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;
この場合、 をcell.tag
現在のセクション ( indexPath.section
) に設定し、 およびで説明した方法をcellForRowAtIndexPath
使用すると思います。visibleCells
headerViewForSection