2013-08-10 24 views
7

Dodaje nową sekcję (sekcja zawiera 3 komórki) u góry UITableView podczas PRZEWIJANIA GÓRY.UITableView wstawianie sekcji u góry podczas przewijania

 [_mainTable beginUpdates]; 
     [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
     [_mainTable endUpdates]; 

Sekcja wsuwa się prawidłowo. Ale zajmuje mi górę tabeli, np. Komórka 0 lub wiersz 0. Chcę, aby ta transakcja była płynna. Mogę wstawić

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
po endUpdates, ale pokazuje szybkie szarpnięcie, ponieważ zajmuje ona górę tabeli, a następnie nagle przewiń ją do ostatniej pozycji.

Jak mogę to zrobić gładko.

Dzięki

Odpowiedz

9

nie robiłem wyczerpujących badań na ten temat, ale to wydaje się obiecujące:

  1. Zidentyfikuj NSIndexPath jednego z widocznych komórek.
  2. Uzyskaj jego rectForRowAtIndexPath.
  3. Uzyskaj bieżący numer contentOffset samej tabeli.
  4. Dodaj sekcję, ale zadzwoń pod numer reloadData zamiast insertSections (co zapobiega przewracaniu się plików).
  5. Get zaktualizowany rectForRowAtIndexPath, że masz w kroku 2.
  6. Aktualizacja contentOffset różnicą wyniku z kroku 5, a od kroku 2.

Zatem:

[self.sections insertObject:newSection atIndex:0]; // this is my model backing my table 

NSIndexPath *oldIndexPath = self.tableView.indexPathsForVisibleRows[0]; // 1 
CGRect before = [self.tableView rectForRowAtIndexPath:oldIndexPath];  // 2 
CGPoint contentOffset = [self.tableView contentOffset];     // 3 
[self.tableView reloadData];            // 4 
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row inSection:oldIndexPath.section + 1]; 
CGRect after = [self.tableView rectForRowAtIndexPath:newIndexPath];  // 5 
contentOffset.y += (after.origin.y - before.origin.y); 
self.tableView.contentOffset = contentOffset;        // 6 
+1

Dziękuję bardzo dużo. Walczyłem z tym długo. – Mann

+0

Chociaż powyższy kod działa jak urok, ale dla mojego osobistego zrozumienia nie dostałem punktu 5. Dlaczego potrzebujemy tu starego prostokąta? Byłbym bardzo wdzięczny, gdybyś to wyczyścił – Mann

+1

@mann Próbowałem tylko zobaczyć, jak bardzo jeden z widocznych wierszy przesunął się w dół. Tak więc otrzymuję rect dla widocznego rzędu przed wstawieniem i ponownie, po, a następnie używam różnicy między wartościami "y", aby dostosować 'contentOffset' powinien być taki, aby wiersz pojawiał się w tym samym miejscu co poprzednio. – Rob

Powiązane problemy