文档章节

循环滚动的ScrollView

王石头
 王石头
发布于 2014/01/05 19:55
字数 355
阅读 157
收藏 1
//.h文件

/*
 *  循环滚动的scrollView
 */

#import <UIKit/UIKit.h>

@protocol DDCycleScrollViewDelegate;

@interface DDCycleScrollView : UIView <UIScrollViewDelegate>
{
    UIScrollView *scrollView_;
}

@property (nonatomic,strong) NSArray *displayViews;
@property (nonatomic,assign) id<DDCycleScrollViewDelegate> delegate;

- (id)initWithFrame:(CGRect)frame;

@end

@protocol DDCycleScrollViewDelegate <NSObject>

- (void)cycleScrollViewDidEndDeceleratingWithCurrentPage:(NSInteger)currentPage
                                         cycleScrollView:(DDCycleScrollView *)scrollView;

@end

//.m文件

#import "DDCycleScrollView.h"

@interface DDCycleScrollView ()
{
    NSInteger currentContentPage_;
    NSInteger totalPage_;
}
@end

@implementation DDCycleScrollView

- (void)dealloc
{
#if !__has_feature(objc_arc)
    [scrollView_ release];
    [_displayViews release];
    [super dealloc];
#endif
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self sharedInit];
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    [self sharedInit];
}

- (void)sharedInit {
    
    currentContentPage_ = 0;
    totalPage_ = 0;
    
    //=======================
    
    scrollView_ = [[UIScrollView alloc] initWithFrame:self.bounds];
    scrollView_.pagingEnabled = YES;
    scrollView_.showsHorizontalScrollIndicator = NO;
    scrollView_.showsVerticalScrollIndicator = NO;
    scrollView_.delegate = self;
    
    CGSize contentSize = CGSizeZero;
    contentSize = CGSizeMake(self.bounds.size.width * 3, self.bounds.size.height);
    
    scrollView_.contentSize = contentSize;
    [self addSubview:scrollView_];
}

#pragma mark - displayViews set
- (void)setDisplayViews:(NSArray *)displayViews {
    if (_displayViews == displayViews) {
        return;
    }
    else {
#if !__has_feature(objc_arc)
        if (_displayViews != nil) {
            [_displayViews release];
        }
        _displayViews = [displayViews retain];
#else
        _displayViews = displayViews;
#endif
        totalPage_ = _displayViews.count;
        
        [self refreshScrollView];
    }
}

#pragma mark - Refresh Content View
- (void)refreshScrollView {
    NSArray *subViews = scrollView_.subviews;
    [subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    NSMutableArray *currentViews = [[NSMutableArray alloc] init];
    [currentViews setArray:[self curDisplayViewsWithCurPage:currentContentPage_]];
    
    int count = currentViews.count;
    for (int i = 0;i < count;i ++) {
        UIView *aView = [currentViews objectAtIndex:i];
        aView.frame = CGRectMake(self.bounds.size.width * i,
                                 0,
                                 self.bounds.size.width,
                                 self.bounds.size.height);
        [scrollView_ addSubview:aView];
    }
    
#if !__has_feature(objc_arc)
    [currentViews release];
#endif
    
    [scrollView_ setContentOffset:CGPointMake(self.bounds.size.width, 0.0f)];
}

- (NSArray *)curDisplayViewsWithCurPage:(NSInteger)curPage {
    int backPage = [self pageNumber:curPage - 1];
    int forwardPage = [self pageNumber:curPage + 1];
    
    NSMutableArray *currentViews = [[NSMutableArray alloc] init];
    [currentViews addObject:[_displayViews objectAtIndex:backPage]];
    [currentViews addObject:[_displayViews objectAtIndex:curPage]];
    [currentViews addObject:[_displayViews objectAtIndex:forwardPage]];
    
#if !__has_feature(objc_arc)
    return [currentViews autorelease];
#endif
    return currentViews;
    
}

- (int)pageNumber:(NSInteger)num {
    int temp = 0;
    if (num == -1) {
        temp = totalPage_ - 1;
    }
    else if (num == totalPage_) {
        temp = 0;
    }
    else {
        temp = num;
    }
    return temp;
}

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    int x = scrollView.contentOffset.x;
    
    if(x >= (2 * scrollView_.bounds.size.width)) {
        currentContentPage_ = [self pageNumber:currentContentPage_ + 1];
        [self refreshScrollView];
    }
    if(x <= 0) {
        currentContentPage_ = [self pageNumber:currentContentPage_ - 1];
        [self refreshScrollView];
    }
    
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if ([self.delegate respondsToSelector:@selector(cycleScrollViewDidEndDeceleratingWithCurrentPage:cycleScrollView:)]) {
        [self.delegate cycleScrollViewDidEndDeceleratingWithCurrentPage:currentContentPage_
                                                        cycleScrollView:self];
    }
}

@end

    

    demo下载地址:https://github.com/JinLeiWang/CycleScrollView



© 著作权归作者所有

王石头
粉丝 8
博文 24
码字总数 26001
作品 0
石景山
程序员
私信 提问
IOS---UIScrollView(无限循环滚动)

UIScrollView自动无限循环滑动 1、UIScrollView概念 UIScrollView是滚动的view,UIView本身不能滚动,子类UIScrollview拓展了滚动方面的功能。 UIScrollView是所有滚动视图的基类。以后的UIT...

一人丨星空
2016/08/27
381
0
ReactNative基础(三)了解ScrollView并打造一个Banner效果

此博客基于react-native-0.48.4 ScrollView简介 一个包装了平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的“响应者”系统。 这个就跟Android中的ScrollView总体来说是一样的,...

a_zhon
2017/09/27
0
0
项目需求讨论-自定义滚轮

大家好,这次又是到了实际的项目需求讨论时间,我的一些文章下面,有时候有人评论,求源码,求Demo,我的主张是仔细看文章,自己理解了再写一遍,会懂得更多。大部分人都习惯直接拿过来用,能...

青蛙要fly
2017/07/04
0
0
关于ScrollView的循环滚动

@junwong 你好,想跟你请教个问题:我在ScrollView上加了多个Button,但我不能像加载图片时做到循环滚动。加入button怎么循环滚动啊?

dyb0415
2012/09/24
2.2K
3
项目需求讨论- 自定义滚轮(第二波新实现)

大家好,在前段时间我写过用ScrollView实现了自定义滚轮,但是在循环的效果不是特别好。(这次文章底部附上了Demo。O(∩_∩)O~) 项目需求讨论-自定义滚轮 用ScrollView 循环有什么问题呢。 ...

青蛙要fly
2017/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

db.properties

jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=falsejdbc.username=rootjdbc.pas......

行者终成事
12分钟前
3
0
从 Storm 到 Flink,汽车之家基于 Flink 的实时 SQL 平台设计思路与实践

在 2019 年之前,之家的大部分实时业务都是运行在 Storm 之上的。Storm 作为早期主流的实时计算引擎,凭借简单的 Spout 和 Bolt 编程模型以及集群本身的稳定性,俘获了大批用户。下图是实时计...

阿里云官方博客
13分钟前
4
0
网络安全-Day04

2.1.1 什么是SQL注入 2.1.2 注入分类 2.1.3 MySQL手工注入 2.1.4 sqlmap使用 2.1.5 总结 什么是SQL注入 SQL注入漏洞原理 什么是SQL 结构化查询语言(Structured Query Language),是一种特殊目...

Jerry1101
13分钟前
3
0
docker容器内安装yum,vim等命令,以及配置ls指令

使用国内镜像 mv /etc/apt/sources.list /etc/apt/sources.list.bakecho "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.listecho "deb http://......

长恭
13分钟前
3
0
超详细的MySQL8.0.17版本安装教程

下载MySQL MySQL的官网地址:https://www.mysql.com/。 如下图所示: 然后点击DOWNLOADS ==> Community,选择MySQL Community Server。如图所示: 滑到页面的最下面,找到Recommended Downl...

彩色泡泡糖
17分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部