一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - IOS - IOS中無限滾動(dòng)Scrollview效果

IOS中無限滾動(dòng)Scrollview效果

2021-01-06 14:55Skyhunter IOS

這篇文章主要為大家詳細(xì)介紹了IOS中無限滾動(dòng)Scrollview效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例講了IOS無限滾動(dòng)效果,分享給大家供大家參考,具體內(nèi)容如下

滑動(dòng)到當(dāng)前位置時(shí)候才去請求,本地有內(nèi)容則直接顯示(以來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
/**
 * 返回當(dāng)前位置
 */
@property (nonatomic, weak)id <HZScrollViewDelegate>delegate;
/**
 * 默認(rèn)圖
 */
@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;
/**
 * 獲取當(dāng)前位置以及便宜
 *
 * @param block 返回內(nèi)容
 */
- (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;
/**
 * 總數(shù)
 */
@property (nonatomic,assign) NSInteger hz_MaxCount;
/**
 * 當(dāng)前位置
 */
@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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久婷婷五月综合色精品首页 | 国产欧美一区二区三区精品 | 视频免费看 | 国产rpg迷雾之风冷狐破解 | 欧美日本一道高清二区三区 | 亚州笫一色惰网站 | 日本护士撒尿xxxxhd | 亚州中文字幕 | 成人丁香婷婷 | 99九九精品视频 | 爽好舒服把腿张小说 | 日本暖暖视频在线观看 | 韩剧消失的眼角膜免费完整版 | 国产v日韩v欧美v精品专区 | 四虎论坛 | 亚洲国产精品第一区二区三区 | 日韩欧美推理片免费看完整版 | 国产午夜精品久久理论片小说 | 国产第一页无线好源 | 午夜性色一区二区三区不卡视频 | 忘忧草研究院一二三 | 日本b站一卡二不卡三卡四卡 | 99精品在线免费观看 | 操小女人 | 色碰视频 | 九九成人免费视频 | 国内久久精品视频 | 国产亚洲女人久久久久久 | 男人午夜免费视频 | 四虎在线播放 | 亚洲AV无码一区二区三区乱子伦 | 99视频全部免费 | 狠狠的撞进去嗯啊h女强男视频 | 美女被草逼 | 亚洲小视频在线 | 精品视频网站 | 国产精品欧美亚洲韩国日本 | 精品国产国产综合精品 | 男女视频在线观看网站 | 成人啪啪漫画羞羞漫画www网站 | 好爽好深好猛好舒服视频上 |