2012-07-19 14 views
22

Desidero che UIScrollView scorra rapidamente dopo lo sweep veloce, like this. Sebbene, quando il cercapersone è attivato, lo scorrimento funzioni one page at a time. È possibile scorrere velocemente, quando l'impaginazione è abilitata con un semplice tocco di un dito senza implementazione manuale utilizzando i riconoscitori di gesti?Sensibilità/Velocità di scorrimento di UIScrollView con cercapersone

+0

Mai trovare una soluzione a questo? – Eric

+0

Vorrei che ci fosse una buona soluzione a questo. Sembra che ci siano due modi per implementarlo: implementare manualmente i riconoscimenti gestuali o implementare manualmente il paging. – UrK

+0

Sì E 'possibile che l'ho implementato prima di 6 mesi. puoi fare manualmente il riconoscimento dei gesti .. – JohnWhite

risposta

40

Questo è abbastanza semplice, tuttavia è necessario implementare l'aspetto di impaginazione (che è abbastanza semplice). Non hai bisogno di riconoscitori di gesti.

Swift

In primo luogo, regolare la UIScrollView tasso di decelerazione:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast 

Supponiamo di avere una vasta gamma di contenuti - chiamiamolo yourPagesArray. Nella tua UIScrollViewDelegate, implementare il seguente metodo:

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 
} 

Sarà inoltre necessario per implementare il seguente metodo delegato, per gestire il caso in cui l'utente solleva il dito delicatamente senza causare alcun rallentamento di scorrimento:

(Aggiornamento:.. non potrebbe essere necessario farlo sotto l'ultimo SDK iOS sembra che il metodo delegato di cui sopra è ora chiamato quando non c'è velocità zero)

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

Impostazione della velocità di decelerazione:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Allora il vostro rotolo implementazione vista delegato:

- (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

Penso che possiamo impostare scrollView.userInteractionEnabled = NO quando il nostro dito toccarlo. E poi quando l'animazione è ferma, aprila. Funziona per me. Spero che ti possa aiutare.

-(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; 
} 
Problemi correlati