IOS中無限滾動Scrollview效果_IOS

來源:互聯網
上載者:User

本文執行個體講了IOS無限滾動效果,分享給大家供大家參考,具體內容如下

滑動到當前位置時候才去請求,本地有內容則直接顯示(以來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/** * 返回當前位置 */@property (nonatomic, weak)id <HZScrollViewDelegate>delegate;/** * 預設圖 */@property (nonatomic, strong) UIImage *hz_placeImage;/** * 圖片列表哇 */@property (nonatomic, strong) NSArray *hz_ImageList;/** * pagecongroll 位置 */@property (nonatomic, assign) HZScrollViewPageControllPosition hz_PageControllPosition;/** * 變換自身frame * * @param offset 位移量 */- (void)transformView:(CGFloat)offset;/** * 擷取當前位置以及便宜 * * @param block 返回內容 */- (void)hz_getContent:(HZReturnBlock)block;  @end

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;\}\  //寬度#define HZ_SWidth  self.bounds.size.width//高度#define HZ_SHeight  self.bounds.size.height  #define HZ_PHeight  16    @interface HZScrollView ()<UIScrollViewDelegate>  @property (nonatomic, copy) HZReturnBlock hz_block;/** * 總數 */@property (nonatomic,assign) NSInteger hz_MaxCount;/** * 當前位置 */@property (nonatomic,assign) NSInteger hz_currentIndex;/** * 容器 */@property (nonatomic, strong) UIScrollView *scrollView;/** * 你懂滴 */@property (nonatomic, strong) UIPageControl *pageControll;  /**視圖**/@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(10, 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:CGRectMake(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:self.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.hz_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         CurrentIndex:@(leftIndex)];    [self checkExistImage:self.hz_ImageList[centerIndex]          ImageView:self.centerImageView         CurrentIndex:@(centerIndex)] ;    [self checkExistImage:self.hz_ImageList[rightIndex]          ImageView:self.rightImageView         CurrentIndex:@(rightIndex)];  }  [self.scrollView setContentOffset:CGPointMake(HZ_SWidth, 0)];  }  - (void)checkExistImage:(NSString *)urlString       ImageView:(UIImageView *)currentImageView      CurrentIndex:(NSNumber *)index{  if ([[[SDWebImageManager sharedManager] imageCache] imageFromDiskCacheForKey:urlString])  {    currentImageView.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 = [param firstObject];  __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) {    currentImageView.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 changeImageWithOffset:scrollView.contentOffset.x];}  - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{  NSInteger index = scrollView.contentOffset.x/scrollView.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

以上就是本文的全部內容,希望對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.