音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

IOS中无限滚动Scrollview效果
日期:2016-02-01 11:18:54   来源:脚本之家

本文实例讲了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

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    Windows系统Linux系统苹果MACAndroidiOS系统鸿蒙系统