Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sensitivity/Scroll speed of UIScrollView with paging

I want UIScrollView to scroll fast after fast sweep, like this. Although, when paging is turned on, the scroll works one page at a time. Is it possible to scroll fast, when paging is enabled with a flick of a finger without manually implementation using gesture recognizers?

like image 762
UrK Avatar asked Jul 19 '12 13:07

UrK


2 Answers

This is fairly straightforward, however you must implement the paging aspect yourself (which is fairly simple). You don't need gesture recognizers.

Swift

First, adjust your UIScrollView deceleration rate:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast 

Assume we have an array of content — let's call it yourPagesArray. In your UIScrollViewDelegate, implement the following method:

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 } 

You will also need to implement the following delegate method, to handle the case where the user lifts their finger gently without causing any scroll deceleration:

(Update: you may not need to do this under the latest iOS SDK. It seems like the above delegate method is now called when there is zero velocity.)

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

Setting your deceleration rate:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Then your scroll view delegate implementation:

- (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];     } } 
like image 160
simeon Avatar answered Sep 19 '22 23:09

simeon


I think we can set scrollView.userInteractionEnabled = NO when our finger touch it. And then when the animation is stop ,open it .It works for me. Hope it will help you.

-(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; } 
like image 34
Hilen Avatar answered Sep 21 '22 23:09

Hilen