本文实例讲了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];}
eturn _##val_imageView;}//宽度#define HZ_SWidthself.bounds.size.width//高度#define HZ_SHeightself.bounds.size.height#define HZ_PHeight16@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 *)currentImageViewCurrentIndex:(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
以上就是本文的全部内容,希望对大家的学习有所帮助。