首页 > 系统 > iOS > 正文

IOS中无限滚动Scrollview效果

2020-07-26 03:28:37
字体:
来源:转载
供稿:网友

本文实例讲了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

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表