当前位置:首页 > 通信资讯 > 正文

本文实例讲了IOS无限滚动效果,分享给大家供大家参考,具体内容如下

滑动到当前位置时候才去请求,本地有内容则直接显示(以来SDWebImage,UIView+Ext)
HZScrollView.h

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 #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

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

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。