IOS中无限滚动Scrollview效果
作者:Skyhunter
这篇文章主要为大家详细介绍了IOS中无限滚动Scrollview效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例讲了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
以上就是本文的全部内容,希望对大家的学习有所帮助。