2012-09-04 14 views
5

Próbuję zaimplementować stronicowanie dla niestandardowych stron w UITableView. To, co próbuję osiągnąć, to wyrównanie górnej części aktywnej komórki z górną krawędzią tablicy w widoku z góry, a jednocześnie wyświetlenie górnej części następnej komórki u dołu tabeli Widok (aby skłonić użytkownika do przewinięcia i zobaczenia więcej komórki).UITableView z niestandardowym zachowaniem podobnym do stronicowania

Moje komórki mają równą wysokość.

Jeśli ustawię wartość paging=YES, spowoduje to niewielkie przesunięcie, które rośnie wraz z przeglądaniem stron. Wynika to z tego, że mój tableView jest nieco wyższy niż pojedyncza komórka, a wysokość komórki/rozmiar strony nie są wyrównane.

Próbowałem różnych rzeczy z włączoną obsługą stronicowania. Próbowałem ustawić rozmiar tableView na wysokość komórki, ale następnie wyłączyć przycinanie i maskowanie, aby użytkownik mógł nadal widzieć następną komórkę. To nie działa, ponieważ następna komórka jest dodawana do podstawowego scrollView w ostatnim ms zanim komórka przewinie się do obwiedni tabeli tableView.

Następnie zacząłem wdrażać różne metody delegatów scrollView, aby naśladować zachowanie stronicowania - nie wydaje mi się, żeby to się udało.

mam, między innymi, próbował coś takiego:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

Chociaż rodzaj robi słusznie, że zachowuje się jak nic Scrollview/Tableview z stronicowania włączone.

Znalazłem kilka postów tutaj od ludzi próbujących osiągnąć to samo, ale odpowiedzi cierpią z powodu tego samego "non-native-snap-feel", że cokolwiek próbowałem sam robi.

Dzięki za udzieloną pomoc.

iOS> = 5,0

+0

czy to działa? – aqs

+0

@aqs sorry sorry, nigdy tak naprawdę nie działał wystarczająco dobrze, aby pozować jako paginacja. – RickiG

+0

nieważne. Wziąłem ten https://github.com/100grams/HGPageScrollView i zmodyfikowany, aby przewinąć w pionie. służy mojemu celowi – aqs

Odpowiedz

3

Jeśli wyłączysz stronicowania można użyć funkcji UIScrollView Delegat:

-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

wdrożyć scrollViewWillEndDragging:withVelocity:targetContentOffset: powrót top współrzędnych komórki najbliżej targetContentOffset nie najbliżej do startu offsetowy. Rozwiązanie jjv360 zapewnia to dobrze, ale możesz je nieco poprawić, w zależności od tego, jak wysokie są twoje komórki (rozwiązanie jjv360 może być zbyt ostre w przypadku naprawdę dużych komórek).

Chciałbym tylko dodać, że można dokonać hamowania UITableView „s szybciej zachowywać się bardziej jak pager UIScrollView zmieniając decelerationRate własności (tylko robić to raz w init/viewDidLoad/gdziekolwiek).

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

Dzięki Filip, po prostu go wypróbuję.Podczas stronicowania z natywnym zachowaniem, nie można przeskoczyć kilku stron, co jest cudownie, co się stanie, jeśli zacisnę punkt końcowy do obiektu docelowegoContentOffset - musi to być tylko następna lub poprzednia komórka. decelerationRate - Nie widziałem tego wcześniej, niesamowite :) – RickiG

+0

Wygląda na to, że wartość opóźnienia nie działa po włączeniu stronicowania. Dzięki za wskazanie tego interfejsu API :) – Tomasz

1

I rozwiązać ten problem z tym kodem:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

Dzięki http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html za wskazanie właściwej drogi.

Powiązane problemy