UITableView
zapewnia metody indexPathsForVisibleRows
i visibleCells
, ale jak mogę uzyskać widoczne sekcje?Jak uzyskać widoczne sekcje interfejsu UITableView?
Odpowiedz
Mam rozwiązanie.
Pierwszy krok, każda sekcja pokaże UIView, który utworzony przez - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
, który będzie przechowywany w tablicy.
Gdy przewijam widok TableView, chcę uwolnić niewidzialny widok przekroju, więc potrzebuję wiedzieć, która sekcja jest widoczna lub nie, wykonaj kod funkcji wykrywa w tym celu, jeśli widok jest widoczny, a następnie zwolnij go.
-(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView*)containerView
{
CGPoint point = containerView.contentOffset;
CGFloat zy = point.y ;
CGFloat py = rect.origin.y + rect.size.height;
if (py - zy <0) {
return FALSE;
}
CGRect screenRect = containerView.frame;
CGFloat by = screenRect.size.height + zy ;
if (rect.origin.y > by) {
return FALSE;
}
return TRUE;
}
(rect
jest rama sekcji UIView
; containerView
jest UITableView
)
W ten sposób można uzyskać widoczne odcinki UITableView
, ale nadzieję SDK zapewnić API w tym celu bezpośrednio.
UITableViews przechowuje komórki za pomocą NSIndexPath. W rezultacie nie ma obiektu dla sekcji. Za pomocą poniższego kodu możemy przemierzać tabelę i wykonywać operacje przy użyciu indeksów widocznych sekcji (nie jestem pewien, dlaczego chcesz widoczne sekcje, ponieważ widoczne tylko oznacza, że są aktualnie na ekranie, ale cokolwiek).
for (NSIndexPath* i in [yourTableViewName indexPathsForVisibleRows])
{
NSUInteger sectionPath = [i indexAtPosition:0];
//custom code here, will run multiple times per section for each visible row in the group
}
Extract odcinki z listy widocznych wierszy:
NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSIndexPath *indexPath in indexPathsForVisibleRows) {
[indexSet addIndex:indexPath.section];
}
NSLog(@"indexSet %@",indexSet);
// indexSet <NSMutableIndexSet: 0x11a5c190>[number of indexes: 5 (in 1 ranges), indexes: (9-13)]
czyli
NSArray *indexPathsForVisibleRows = [detailTableView indexPathsForVisibleRows];
NSMutableSet *sectionSet = [NSMutableSet set];
for (NSIndexPath *indexPath in indexPathsForVisibleRows) {
[sectionSet addObject:[NSNumber numberWithInt:indexPath.section]];
}
NSLog(@"sectionSet %@",sectionSet);
// sectionSet {(13, 11, 9, 10, 12)}
Innym rozwiązaniem, użyj 1 bit w znaczniku sekcji nagłówka widoku danych, tak
#define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1<<30))
#define _TBL_TAG_CLEAR(_TAG) ((_TAG)&((1<<30)-1))
#define _TBL_TAG_IS_SECTION(_TAG) ((_TAG)>>30)
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
// alloc header view
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
header.tag = _TBL_TAG_SECTION(section);
return header;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect r = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y,
CGRectGetWidth(scrollView.frame),
CGRectGetHeight(scrollView.frame));
for (UIView *v in [_tableView subviews]) {
if (CGRectIntersectsRect(r, v.frame)) {
if (_TBL_TAG_IS_SECTION(v.tag)) {
NSLog(@"visible section tag %d", _TBL_TAG_CLEAR(v.tag));
}
}
}
}
Lub naprawdę łatwy sposób byłoby skorzystać z valueForKeyPath i klasy NSSet:
NSSet *visibleSections = [NSSet setWithArray:[[self.tableView indexPathsForVisibleRows] valueForKey:@"section"]];
Zasadniczo otrzymuje się tablicę wartości przekrojów w widocznych wierszach, a następnie wypełnia się zestawem, aby usunąć duplikaty. Rozwiązanie krok
Co za pięknie prosta odpowiedź. Dzięki! – ArtSabintsev
To nie będzie działać dla sekcji bez wierszy w nich. –
@ MikkelSelsøe Jeśli w sekcji nie ma żadnych wierszy, sekcja też nie jest widoczna ... więc nie jestem pewien, co mówisz, nie działa. –
2, aby uzyskać widoczne sekcje w UITableView:
1) Dodać widoki głowicy do zmienny tablicy w viewForHeaderInSection
2) Aktualizacja tablicę gdy przewija Tableview w scrollViewDidScroll
nocie korzystanie z nieruchomości tag posiadać numer sekcji
@property (nonatomic, strong, readwrite) NSMutableArray *headerArray;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 40)];
headerView.backgroundColor = [UIColor greenColor];
headerView.tag = section;
[_headerArray addObject:headerView];
return headerView;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self updateHeaderArray];
NSLog(@"------------");
for (UIView *view in _headerArray) {
NSLog(@"visible section:%d", view.tag);
}
}
- (void)updateHeaderArray {
// remove invisible section headers
NSMutableArray *removeArray = [NSMutableArray array];
CGRect containerRect = CGRectMake(_tableView.contentOffset.x, _tableView.contentOffset.y,
_tableView.frame.size.width, _tableView.frame.size.height);
for (UIView *header in _headerArray) {
if (!CGRectIntersectsRect(header.frame, containerRect)) {
[removeArray addObject:header];
}
}
[_headerArray removeObjectsInArray:removeArray];
}
odpowiedź jest dużo prostsza i neater z KVC
NSArray *visibleSections = [self.tableView.indexPathsForVisibleRows valueForKey:@"section"];
może to dać tablicę z podwójnymi wartościami, ale możesz nią zarządzać.
Jeśli czytasz moją odpowiedź jako wysłaną 3 miesiące przed twoją już korzystam z tej techniki, a następnie użyj zestawu, aby pozbyć się duplikatów . –
@ ChristopherKing, moje złe. Nie sprawdzaj w momencie opublikowania odpowiedzi. – thesummersign
for (NSUInteger section = 0; section < self.tableView.numberOfSections; ++section) {
UIView *headerView = [self.tableView headerViewForSection:section];
if (headerView.window) {
NSLog(@"its visible");
}
}
wersja Swift
if let visibleRows = tableView.indexPathsForVisibleRows {
let visibleSections = visibleRows.map({$0.section})
}
- 1. iPhone UITableView Sekcje
- 2. Sekcje grupowania UITableView z NSMutableArray
- 3. cellForRowAtIndexPath nie wywołane; sekcje zwraca 1, a wiersze zwraca 4
- 4. Jak ustawić UITableView do zgrupowanego stylu?
- 5. Jak można uzyskać wybrane wiersze z UITableView?
- 6. Jak uzyskać migawkę UITableView w formacie PDF
- 7. Jak uzyskać dane NSDictionary w UITableView
- 8. Elementy interfejsu iOS UITableView z pobraną komendą FetchedResultsController
- 9. iOS6 UICollectionView i UIPageControl - jak uzyskać widoczne komórki?
- 10. Zdobądź ListView Widoczne pozycje
- 11. Jak komentować całe sekcje pliku .htaccess?
- 12. HorizontalScrollView pobierz Widoczne dzieci
- 13. Konwertowanie widoku tabeli na sekcje
- 14. Jak uzyskać typ modułu z interfejsu?
- 15. Jak uzyskać adres IPv6 interfejsu pod Linuksem
- 16. Jak uzyskać adres MAC interfejsu sieciowego WiFi?
- 17. ZURB 4 sekcje oddzielnie przewijalne
- 18. Jak uzyskać iOS 6 UITableView Zgrupowane style w IOS 7
- 19. Jak uzyskać Indexpath komórki w UITableView, klikając przycisk Custom accessory?
- 20. Jak uzyskać pełny ekran UITableView (z nagłówkiem) w iPhone X?
- 21. Przepełnienie: Widoczne na SVG
- 22. Kod MATLAB sekcje - Script vs. Funkcja
- 23. JQuery Widoczne Pokaż
- 24. Jak uzyskać indeksy widocznych wierszy dla NSOutlineView?
- 25. Jak połączyć łańcuchy widoczne dla rxjs?
- 26. HTML jak określić, które elementy są widoczne?
- 27. Jak wyrównać (wyśrodkować) zawartość UITableView?
- 28. Jak zatrzymać przewijanie UITableView
- 29. Zwiń wszystkie sekcje kodów XAML naraz
- 30. Sekcja UITableView z tłem clearColor?
ale jeśli nie ma komórki w sekcjach wówczas metoda „indexPathsForVisibleRows” zwróci wartość null ..... – iXcoder
Chcę wiedzieć, czy sekcja jest widoczna na ekranie, a następnie mogę za darmo lub utwórz go dynamicznie, czy też trzeba go zachować, by zjeść dużo pamięci ... – iXcoder
Dodałem odpowiedź, która obsługuje sekcje bez komórek tutaj http://stackoverflow.com/a/23538021/895099 – adamsiton