Infinite scrolling ScrollView effect in IOS _ios

Source: Internet
Author: User
Tags uikit

This article examples of iOS unlimited scrolling effect, share for everyone to refer to, the specific contents are as follows

Slide to the current position to request, local content is directly displayed (since Sdwebimage,uiview+ext)
HZScrollView.h

#import <UIKit/UIKit.h> typedef void (^hzreturnblock) (Nsinteger index,cgfloat offset);
  typedef ns_enum (Nsuinteger, hzscrollviewpagecontrollposition) {hzscrollviewpagecontrollpositionnone,
  Hzscrollviewpagecontrollpositionleft, Hzscrollviewpagecontrollpositioncenter,
  
Hzscrollviewpagecontrollpositionright,};
@class Hzscrollview; @protocol hzscrollviewdelegate <NSObject> @optional-(void) Resetposition: (Hzscrollview *) ScrollView Andindex: (
  
Nsinteger) index; @end @interface Hzscrollview:uiview/** * Back to current position */@property (nonatomic, weak) ID  

hzscrollview.m

#import "Uiimageview+webcache.h" #import "HZScrollView.h" #import "uiview+dylanframtool.h" #define Hz_formatimage (Val
_imageview) \-(Uiimageview *) val_imageview\ {\ if (!_# #val_imageView) {\ _# #val_imageView = [[Uiimageview alloc] Init];\ }\ return _# #val_imageView; \}   \//Width #define HZ_SWIDTH self.bounds.size.width//height #define Hz_sheight self.bounds.size.height #define Hz_pheight
@interface Hzscrollview () <UIScrollViewDelegate> @property (nonatomic, copy) Hzreturnblock Hz_block;
/** * Total number * * * @property (nonatomic,assign) Nsinteger Hz_maxcount;
/** * Current Position * * * @property (nonatomic,assign) Nsinteger Hz_currentindex;
/** * Container * * * @property (nonatomic, strong) Uiscrollview *scrollview;
  
/** * You know the drop * * * * @property (nonatomic, strong) Uipagecontrol *pagecontroll;
/** View **/@property (nonatomic, strong) Uiimageview *leftimageview;
@property (nonatomic, strong) Uiimageview *centerimageview;
  
@property (nonatomic, strong) Uiimageview *rightimageview; @end @implEmentation Hzscrollview {cgrect _hz_frame;}
  #pragma mark-#pragma mark-init-(instancetype) initWithFrame: (CGRect) frame {self = [super Initwithframe:frame];
    if (self) {_hz_frame = Frame;
    [Self addSubview:self.scrollView];
    [Self configimageview];
  [Self addSubview:self.pageControll];
return self; #pragma mark-#pragma mark-config-(void) Configimageview {self.leftImageView.frame = CGRectMake (0, 0, Hz_swidth,
  Hz_sheight);
  [Self.scrollview AddSubview:self.leftImageView];
  Self.centerImageView.frame = CGRectMake (hz_swidth, 0, Hz_swidth, hz_sheight);
  [Self.scrollview AddSubview:self.centerImageView];
  Self.rightImageView.frame = CGRectMake (hz_swidth * 2, 0, Hz_swidth, hz_sheight);
[Self.scrollview AddSubview:self.rightImageView]; #pragma mark-#pragma mark-reset-(void) Sethz_placeimage: (UIImage *) hz_placeimage {_hz_placeimage = Hz_placeimage
  ;
  [Self changeimageleft:-1 center:-1 right:-1]; if (self.hz_maxcount) {[Self SetHZ_MaxCount:self.hz_ImageList.count];
  }-(void) Sethz_imagelist: (Nsarray *) hz_imagelist {_hz_imagelist = [hz_imagelist copy];
[Self sethz_maxcount:_hz_imagelist.count];
    
  }-(void) Sethz_maxcount: (Nsinteger) hz_maxcount {_hz_maxcount = Hz_maxcount;
      Switch (_hz_maxcount) {case 0:self.scrollview.scrollenabled = NO;
      [Self changeimageleft:-1 center:-1 right:-1];
    Break
      Case 1:self.scrollview.scrollenabled = NO;
      [Self changeimageleft:0 center:0 right:0];
        
    Break
      default:self.scrollView.scrollEnabled = YES;
      [Self changeimageleft:_hz_maxcount-1 center:0 right:1];
  Break
  } self.pageControll.numberOfPages = _hz_maxcount;
[Self sethz_pagecontrollposition:_hz_pagecontrollposition]; }-(void) Sethz_pagecontrollposition: (hzscrollviewpagecontrollposition) hz_pagecontrollposition {_hz_
  Pagecontrollposition = hz_pagecontrollposition;
  CGFloat width = self.hz_maxcount * hz_pheight; Switch (_hz_pagecontrollposition) {Case HZScrollViewPageControllPositionNone:self.pageControll.hidden = YES;
    Break
      Case HZScrollViewPageControllPositionLeft:self.pageControll.hidden = NO; Self.pageControll.frame = CGRectMake (Ten, SELF.PAGECONTROLL.FRAME.ORIGIN.Y, width,
      Self.pageControll.frame.size.height);
    Break
      Case HZScrollViewPageControllPositionCenter:self.pageControll.hidden = NO; Self.pageControll.frame = CGRectMake (self.bounds.size.width-width)/2.f, self.pagecontroll.frame.origin.y, Width,
      Self.pageControll.frame.size.height);
    Break
      Case HZScrollViewPageControllPositionRight:self.pageControll.hidden = NO; Self.pageControll.frame = CGRectMake (Self.bounds.size.width-10-width, SELF.PAGECONTROLL.FRAME.ORIGIN.Y, Width,
      Self.pageControll.frame.size.height);
    Break
  Default:break;
  } if (width <= hz_pheight) {Self.pageControll.hidden = YES; }} #pragma mark-#pragma mark-lz-(Uiscrollview *) ScrollView {if (!_scrollview) {_scrollview = [[Uiscrollview alloc] initWithFrame:self.bounds];
    _scrollview.pagingenabled = YES;
    _scrollview.showshorizontalscrollindicator = NO;
    _scrollview.delegate = self;
  _scrollview.contentsize = Cgsizemake (Hz_swidth * 3,0);
return _scrollview; }-(Uipagecontrol *) Pagecontroll {if (!_pagecontroll) {_pagecontroll = [[Uipagecontrol alloc] Initwithframe:cgrec
    Tmake (0,hz_sheight-hz_pheight,hz_pheight, 7)];
    _pagecontroll.pageindicatortintcolor = [Uicolor Lightgraycolor];
    _pagecontroll.currentpageindicatortintcolor = [Uicolor Whitecolor];
    _pagecontroll.numberofpages = Self.hz_maxcount;
  _pagecontroll.currentpage = 0;
return _pagecontroll;
} hz_formatimage (Leftimageview);
Hz_formatimage (Centerimageview);
Hz_formatimage (Rightimageview); #pragma mark-#pragma mark-private method-(void) Changeimagewithoffset: (cgfloat) OffsetX {if (OffsetX >= Hz_swidth * 2) {self.hz_currentindex++; if (Self.hz_currentindex = = self.hz_maxcount-1) {[Self changeimageleft:self.hz_currentindex-1 center:s
        
    Elf.hz_currentindex right:0];
      }else if (Self.hz_currentindex = = self.hz_maxcount) {self.hz_currentindex = 0;
        
    [Self changeimageleft:self.hz_maxcount-1 center:0 right:1];
    }else {[Self changeimageleft:self.hz_currentindex-1 center:self.hz_currentIndex right:self.hz_currentIndex + 1];
    } if (Self.hz_block) {self.hz_block (SELF.HZ_CURRENTINDEX,OFFSETX);
      
  } self.pageControll.currentPage = Self.hz_currentindex;
      
    } if (OffsetX <= 0) {self.hz_currentindex--;
        
    if (Self.hz_currentindex = = 0) {[self changeimageleft:self.hz_maxcount-1 center:0 right:1];
      }else if (Self.hz_currentindex = = 1) {self.hz_currentindex = self.hz_maxcount-1; [Self changeimageleft:self.hz_currentindex-1 center:self.hZ_currentindex right:0];
    }else {[self changeimageleft:self.hz_currentindex-1 center:self.hz_currentIndex right:self.hz_currentindex+1];
    } if (Self.hz_block) {self.hz_block (SELF.HZ_CURRENTINDEX,OFFSETX);
  } self.pageControll.currentPage = Self.hz_currentindex;
    
} [self sethz_pagecontrollposition:_hz_pagecontrollposition]; }-(void) Changeimageleft: (nsinteger) Leftindex Center: (nsinteger) Centerindex right: (Nsinteger) Rightindex {if (self.h
  Z_currentindex > Self.hz_maxcount) {return; } if (Leftindex = = 1 && centerindex = = 1 && rightindex = = 1) {self.leftImageView.image = Self.hz
    _placeimage;
    Self.centerImageView.image = Self.hz_placeimage;
  Self.rightImageView.image = Self.hz_placeimage; else {[self checkexistimage:self.hz_imagelist[leftindex] ImageView:self.leftImageView currentind
    ex:@ (Leftindex)]; [Self Checkexistimage:self.hz_imagelist[centerindex] ImAgeView:self.centerImageView currentindex:@ (Centerindex)]; [Self Checkexistimage:self.hz_imagelist[rightindex] ImageView:self.rightImageView currentindex:@ (righti
  Ndex)];
  
[Self.scrollview setcontentoffset:cgpointmake (hz_swidth, 0)]; }-(void) Checkexistimage: (NSString *) urlstring ImageView: (Uiimageview *) Currentimageview currentindex: (NS Number *) Index {if ([[[[Sdwebimagemanager Sharedmanager] imagecache] imagefromdiskcacheforkey:urlstring]) {Curren
    Timageview.image = [[[Sdwebimagemanager Sharedmanager] imagecache] imagefrommemorycacheforkey:urlstring];
  Return
    else {currentimageview.image = Self.hz_placeimage;
    if (self.hz_currentindex!= [index IntegerValue]) {return; [Self performselector: @selector (downloadimage:) Withobject:@[urlstring,currentimageview] afterdelay:0 inModes:@[
  Nsdefaultrunloopmode]]; }}-(void) Downloadimage: (Nsarray *) param {nsstring *urlstring = [paramObject];
  __weak uiimageview *currentimageview = [param lastobject]; [[Sdwebimagemanager Sharedmanager] Downloadimagewithurl:[nsurl urlwithstring:urlstring] options:0 progress:^ (
  Nsinteger receivedsize, Nsinteger expectedsize) {NSLog (@ "received:%@", @ (receivedsize)); } completed:^ (UIImage *image, Nserror *error, Sdimagecachetype CacheType, BOOL finished, Nsurl *imageURL) {CurrentIma
Geview.image = image;
    [[[Sdwebimagemanager Sharedmanager] imagecache] storeimage:image forkey:urlstring];
  [[[Sdwebimagemanager Sharedmanager] imagecache] storeimage:image forkey:urlstring Todisk:yes];
}]; #pragma mark-#pragma mark-uiscrollviewdelegate-(void) Scrollviewdidscroll: (Uiscrollview *) ScrollView {[Self chan
Geimagewithoffset:scrollview.contentoffset.x]; }-(void) scrollviewdidenddecelerating: (Uiscrollview *) ScrollView {Nsinteger index = Scrollview.contentoffset.x/scro
    
  Llview.width; if ([Self.delegate respondstoselector: @selector (resetposition:andindex:)]) {[Self.delegate resetposition:self AndIndex:self.hz_currentIndex]; 
  } #pragma mark-#pragma mark-public method-(void) Transformview: (cgfloat) offset {if (offset > 0) {return;
  } cgfloat currentheight = 210-offset;
  Self.height = Currentheight;
  CGFloat Currentscale = currentheight/_hz_frame.size.height;
  Self.left = _hz_frame.origin.x-(_hz_frame.size.width * Currentscale-_hz_frame.size.width)/2.f;
  Self.width = _hz_frame.size.width * Currentscale;
    
  Self.top = offset;
    
  Self.scrollView.size = self.size;
  Self.leftImageView.size = self.size;
  Self.centerImageView.size = self.size;
    
  Self.rightImageView.size = self.size;
    
  self.centerimageview.x = Self.width;
    
  self.rightimageview.x = Self.width * 2;
  Self.scrollView.contentSize = Cgsizemake (self.width *3, self.height);
[Self.scrollview setcontentoffset:cgpointmake (hz_swidth, 0)]; }-(void) Hz_getcontent: (hzreturnblock) block {self.hz_block = block;}-(void) Layoutsubviews {[Super layoutsubviews]; } @end

The above is the entire content of this article, I hope to help you learn.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.