IOS中无限滚动Scrollview效果的介绍

来源:爱站网时间:2021-01-23编辑:网友分享
今天本文中将为大家分享IOS中无限滚动Scrollview效果的介绍,想必这个是很多用户们都想了解的,那么下面小编就分享给大家供大家参考。

今天本文中将为大家分享IOS中无限滚动Scrollview效果的介绍,想必这个是很多用户们都想了解的,那么下面小编就分享给大家供大家参考。

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

#import 
  
typedef void(^HZReturnBlock)(NSInteger index,CGFloat offset);
  
typedef NS_ENUM(NSUInteger, HZScrollViewPageControllPosition) {
  HZScrollViewPageControllPositionNone,
  HZScrollViewPageControllPositionLeft,
  HZScrollViewPageControllPositionCenter,
  HZScrollViewPageControllPositionRight,
};
  
@class HZScrollView;
@protocol HZScrollViewDelegate 
  
@optional
- (void)resetPosition:(HZScrollView *)scrollView AndIndex:(NSInteger)index;
  
@end
  
@interface HZScrollView : UIView
/**
 * 返回当前位置
 */
@property (nonatomic, weak)id 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 ()
  
@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_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  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

上文就是小编分享IOS中无限滚动Scrollview效果的介绍,相信会对大家有一定的帮助的,有时候要针对具体情况来采取不同的对策,切不可生搬硬套。

上一篇:iOS远程推送的实现代码

下一篇:iOS实现购物分类模块的方案

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载