2012-07-19 19 views
22

Chcę, aby funkcja UIScrollView szybko przewijała po szybkim przeciągnięciu, like this. Mimo że stronicowanie jest włączone, scroll działa one page at a time. Czy można przewijać szybko, gdy stronicowanie jest włączone jednym ruchem palca bez ręcznej implementacji za pomocą rozpoznawania gestów?Czułość/szybkość przewijania UIScrollView z funkcją stronicowania

+0

Czy kiedykolwiek znajdziesz rozwiązanie tego problemu? – Eric

+0

Szkoda, że ​​nie było dobre rozwiązanie tego. Wydaje się, że istnieją dwa sposoby na wdrożenie tego: ręczne wdrażanie rozpoznawania gestów lub ręczne wdrażanie stronicowania. – UrK

+0

Tak Jest możliwe, że został wprowadzony przed upływem 6 miesięcy. możesz zrobić ręcznie, rozpoznać gesty .. – JohnWhite

Odpowiedz

40

Jest to dość proste, jednak musisz sam wdrożyć aspekt stronicowania (co jest dość proste). Nie potrzebujesz rozpoznawania gestów.

Swift

Po pierwsze, dostosować UIScrollView stopy opóźnienia:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast 

że mamy tablicę treści - nazwijmy to yourPagesArray. W swojej UIScrollViewDelegate, wdrożyć następujące metody:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 
{ 
    //This is the index of the "page" that we will be landing at 
    let nearestIndex = Int(CGFloat(targetContentOffset.pointee.x)/scrollView.bounds.size.width + 0.5) 

    //Just to make sure we don't scroll past your content 
    let clampedIndex = max(min(nearestIndex, yourPagesArray.count - 1), 0) 

    //This is the actual x position in the scroll view 
    var xOffset = CGFloat(clampedIndex) * scrollView.bounds.size.width 

    //I've found that scroll views will "stick" unless this is done 
    xOffset = xOffset == 0.0 ? 1.0 : xOffset 

    //Tell the scroll view to land on our page 
    targetContentOffset.pointee.x = xOffset 
} 

Potrzebny będzie również wdrożyć następujące metody delegata, aby obsłużyć przypadek, gdy użytkownik podnosi ich palcem delikatnie, nie powodując żadnych przewijania opóźnienia:

(Aktualizacja:.. może nie trzeba robić tego pod najnowszym iOS SDK wydaje się, że powyższa metoda delegat nazywa się teraz, kiedy nie jest zerowa prędkość)

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 
{ 
    if !decelerate 
    { 
     let currentIndex = floor(scrollView.contentOffset.x/scrollView.bounds.size.width) 

     let offset = CGPoint(x: scrollView.bounds.size.width * currentIndex, y: 0) 

     scrollView.setContentOffset(offset, animated: true) 
    } 
} 

Objective-C

Ustawianie szybkości opóźnienia:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Wtedy twój widok przewijania realizacja delegat:

- (void) scrollViewWillEndDragging:(UIScrollView *)scroll withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    //This is the index of the "page" that we will be landing at 
    NSUInteger nearestIndex = (NSUInteger)(targetContentOffset->x/scrollView.bounds.size.width + 0.5f); 

    //Just to make sure we don't scroll past your content 
    nearestIndex = MAX(MIN(nearestIndex, yourPagesArray.count - 1), 0); 

    //This is the actual x position in the scroll view 
    CGFloat xOffset = nearestIndex * scrollView.bounds.size.width; 

    //I've found that scroll views will "stick" unless this is done 
    xOffset = xOffset==0?1:xOffset; 

    //Tell the scroll view to land on our page 
    *targetContentOffset = CGPointMake(xOffset, targetContentOffset->y); 
} 

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if(!decelerate) 
    { 
     NSUInteger currentIndex = (NSUInteger)(scrollView.contentOffset.x/scrollView.bounds.size.width); 

     [scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width * currentIndex, 0) animated:YES]; 
    } 
} 
1

myślę, że możemy ustawić scrollView.userInteractionEnabled = NIE, gdy nasz palec dotknąć. A potem, gdy animacja się zatrzyma, otwórz ją. To działa dla mnie. Mam nadzieję, że ci to pomoże.

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 
    scrollView.userInteractionEnabled = NO; 
} 

// at the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    scrollView.userInteractionEnabled = YES; 
} 
Powiązane problemy