iOS--UIScrollView的一个封装好的自动滚动视图
2015-03-01 20:39
633 查看
UIScrollView可以用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看。它是视图,但是比较特殊,可以看成把它看成2层的结构。上面是它的frame层,跟一般试图一样,是它的可见区域,下面层是contentView,可以滑动。
实现的功能:图片会间隔同样的时间实现自动循环滚动
MyScrollView.h
// 使用协议实现传值
@protocol MyScrollViewDelegate <NSObject>
- (void)selectScrollIndex:(NSInteger)index imageView:(UIImageView
*)imageView;
@end
@interface MyScrollView :
UIView
// 接收图片名称的数组
- (void)setImages:(NSMutableArray *)names state:(BOOL)state;
// 设置代理人
@property(nonatomic,
assign)id<MyScrollViewDelegate>delegate;
@end
MyScrollView.m
@interface
MyScrollView ()<UIScrollViewDelegate>
// 在延展里设置属性,增大生命周期
@property(nonatomic,
retain)UIScrollView *scroll;
@property(nonatomic,
assign) NSInteger page;
@end
@implementation MyScrollView
- (void)dealloc
{
[_scroll release];
[super dealloc];
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super
initWithFrame:frame];
if (self) {
self.page =
1;
//
初始化UIScrollView,frame 与父视图的一样高宽
self.scroll = [[UIScrollView
alloc] initWithFrame:CGRectMake(0,
0, self.frame.size.width,
self.frame.size.height)];
self.scroll.delegate =
self;
self.scroll.bounces =
NO;
[self addSubview:self.scroll];
[self.scroll
release];
}
return
self;
}
#pragma mark -
#pragma mark 给scroll提供图片名字,添加图片
- (void)setImages:(NSMutableArray *)names state:(BOOL)state
{
if (state == YES) {
//
计时器,每隔几秒干什么事(实现自动滚动功能)
[NSTimer
scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(timeAction:)
userInfo:nil
repeats:YES];
}
//
循环滚动需要多俩张图片 头和脚
NSString *firstName = [names
firstObject];
NSString *lastName = [names
lastObject];
[names insertObject:lastName
atIndex:0];
[names addObject:firstName];
//
设置可以滚动的范围大小
[self.scroll
setContentSize:CGSizeMake(self.scroll.frame.size.width
* names.count, 0)];
// 整页翻动
self.scroll.pagingEnabled =
YES;
//
向ScrollView中添加照片
int i = 0;
//
根据照片名遍历添加照片
for (NSString *name
in names) {
UIImage *image = [UIImage
imageNamed:name];
//
根据第几张图片,设置UIImageView的frame
UIImageView *view = [[UIImageView
alloc] initWithFrame:CGRectMake(self.scroll.frame.size.width
* i, 0, self.scroll.frame.size.width,
self.scroll.frame.size.height)];
view.image = image;
view.userInteractionEnabled =
YES;
//
添加到ScrollView
[self.scroll
addSubview:view];
[view release];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer
alloc]
initWithTarget:self
action:@selector(tapAction:)];
[view addGestureRecognizer:tap];
i++;
}
[self.scroll
setContentOffset:CGPointMake(self.scroll.frame.size.width,
0)];
}
- (void)timeAction:(NSTimer *)timer
{
//
触发之后页数+1
self.page++;
//
设置偏移量
CGFloat offWidth =
self.page *
self.scroll.frame.size.width;
NSLog(@"触发");
//
加动画
[UIView
animateWithDuration:1.8f
animations:^{
//
改变偏移量,一页一页翻动
[self.scroll
setContentOffset:CGPointMake(offWidth,
0)];
}];
NSInteger number =
self.scroll.contentSize.width /
self.scroll.frame.size.width;
if (self.page == number -
1) {
self.page =
1;
self.scroll.contentOffset =
CGPointMake(self.scroll.frame.size.width,
0);
}
}
#pragma mark -
#pragma mark 协议方法,实现循环滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//
判断为最后一张时,改变偏移量
CGPoint point = scrollView.contentOffset;
CGSize size = scrollView.contentSize;
CGFloat width = scrollView.frame.size.width;
self.page = point.x / width;
if (point.x == size.width - width) {
self.page =
1;
scrollView.contentOffset =
CGPointMake(width, 0);
}else if (point.x ==
0){
scrollView.contentOffset =
CGPointMake(size.width -
2 * width, 0);
self.page =
self.scroll.contentSize.width /
self.scroll.frame.size.width
- 2;
}
}
#pragma mark -
#pragma mark 手势触发的事件
- (void)tapAction:(UITapGestureRecognizer *)tap
{
UIImageView *aView = (UIImageView *)tap.view;
NSInteger currentPage =
self.page;
//
加入当前是滚动到第0下标的那张图片,则返回到调用界面所提供的照片的最后一个
if (currentPage ==
0) {
currentPage = self.scroll.contentSize.width /
self.scroll.frame.size.width -
3;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
//
如果滚到最后一张图片,则返回的是提供的第一张图片
if (currentPage ==
self.scroll.contentSize.width /
self.scroll.frame.size.width -
1){
currentPage = 0;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
//
假如不符合以上俩种情况,则说明在中间,只需要减一即可
currentPage--;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
实现的功能:图片会间隔同样的时间实现自动循环滚动
MyScrollView.h
// 使用协议实现传值
@protocol MyScrollViewDelegate <NSObject>
- (void)selectScrollIndex:(NSInteger)index imageView:(UIImageView
*)imageView;
@end
@interface MyScrollView :
UIView
// 接收图片名称的数组
- (void)setImages:(NSMutableArray *)names state:(BOOL)state;
// 设置代理人
@property(nonatomic,
assign)id<MyScrollViewDelegate>delegate;
@end
MyScrollView.m
@interface
MyScrollView ()<UIScrollViewDelegate>
// 在延展里设置属性,增大生命周期
@property(nonatomic,
retain)UIScrollView *scroll;
@property(nonatomic,
assign) NSInteger page;
@end
@implementation MyScrollView
- (void)dealloc
{
[_scroll release];
[super dealloc];
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super
initWithFrame:frame];
if (self) {
self.page =
1;
//
初始化UIScrollView,frame 与父视图的一样高宽
self.scroll = [[UIScrollView
alloc] initWithFrame:CGRectMake(0,
0, self.frame.size.width,
self.frame.size.height)];
self.scroll.delegate =
self;
self.scroll.bounces =
NO;
[self addSubview:self.scroll];
[self.scroll
release];
}
return
self;
}
#pragma mark -
#pragma mark 给scroll提供图片名字,添加图片
- (void)setImages:(NSMutableArray *)names state:(BOOL)state
{
if (state == YES) {
//
计时器,每隔几秒干什么事(实现自动滚动功能)
[NSTimer
scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(timeAction:)
userInfo:nil
repeats:YES];
}
//
循环滚动需要多俩张图片 头和脚
NSString *firstName = [names
firstObject];
NSString *lastName = [names
lastObject];
[names insertObject:lastName
atIndex:0];
[names addObject:firstName];
//
设置可以滚动的范围大小
[self.scroll
setContentSize:CGSizeMake(self.scroll.frame.size.width
* names.count, 0)];
// 整页翻动
self.scroll.pagingEnabled =
YES;
//
向ScrollView中添加照片
int i = 0;
//
根据照片名遍历添加照片
for (NSString *name
in names) {
UIImage *image = [UIImage
imageNamed:name];
//
根据第几张图片,设置UIImageView的frame
UIImageView *view = [[UIImageView
alloc] initWithFrame:CGRectMake(self.scroll.frame.size.width
* i, 0, self.scroll.frame.size.width,
self.scroll.frame.size.height)];
view.image = image;
view.userInteractionEnabled =
YES;
//
添加到ScrollView
[self.scroll
addSubview:view];
[view release];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer
alloc]
initWithTarget:self
action:@selector(tapAction:)];
[view addGestureRecognizer:tap];
i++;
}
[self.scroll
setContentOffset:CGPointMake(self.scroll.frame.size.width,
0)];
}
- (void)timeAction:(NSTimer *)timer
{
//
触发之后页数+1
self.page++;
//
设置偏移量
CGFloat offWidth =
self.page *
self.scroll.frame.size.width;
NSLog(@"触发");
//
加动画
[UIView
animateWithDuration:1.8f
animations:^{
//
改变偏移量,一页一页翻动
[self.scroll
setContentOffset:CGPointMake(offWidth,
0)];
}];
NSInteger number =
self.scroll.contentSize.width /
self.scroll.frame.size.width;
if (self.page == number -
1) {
self.page =
1;
self.scroll.contentOffset =
CGPointMake(self.scroll.frame.size.width,
0);
}
}
#pragma mark -
#pragma mark 协议方法,实现循环滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//
判断为最后一张时,改变偏移量
CGPoint point = scrollView.contentOffset;
CGSize size = scrollView.contentSize;
CGFloat width = scrollView.frame.size.width;
self.page = point.x / width;
if (point.x == size.width - width) {
self.page =
1;
scrollView.contentOffset =
CGPointMake(width, 0);
}else if (point.x ==
0){
scrollView.contentOffset =
CGPointMake(size.width -
2 * width, 0);
self.page =
self.scroll.contentSize.width /
self.scroll.frame.size.width
- 2;
}
}
#pragma mark -
#pragma mark 手势触发的事件
- (void)tapAction:(UITapGestureRecognizer *)tap
{
UIImageView *aView = (UIImageView *)tap.view;
NSInteger currentPage =
self.page;
//
加入当前是滚动到第0下标的那张图片,则返回到调用界面所提供的照片的最后一个
if (currentPage ==
0) {
currentPage = self.scroll.contentSize.width /
self.scroll.frame.size.width -
3;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
//
如果滚到最后一张图片,则返回的是提供的第一张图片
if (currentPage ==
self.scroll.contentSize.width /
self.scroll.frame.size.width -
1){
currentPage = 0;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
//
假如不符合以上俩种情况,则说明在中间,只需要减一即可
currentPage--;
[self.delegate
selectScrollIndex:currentPage
imageView:aView];
NSLog(@"%ld", currentPage);
return;
}
相关文章推荐
- iOS UIScrollView滚动视图/无限循环滚动/自动滚动
- iOS UIScrollView滚动视图/无限循环滚动/自动滚动
- ios UIScrollView自动滚动 循环滚动视图实现
- iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码
- 一个封装好的iOS无限滚动组件HXInfiniteScrollView
- UIScrollView 滚动视图—IOS开发
- UIScrollView 滚动视图—IOS开发
- 滚动视图(UIScrollView)无限无缝左右切换图片,自动顺序加逆序循环播放图片
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- iOS-利用UIScrollView实现展示图片的无限滚动及自动滚动
- UIScrollView 滚动视图—IOS开发
- iOS UIScrollView中实现分页滚动--定时自动滚动分页
- iOS之 UIScrollView 滚动视图的使用
- iOS开发滚动视图UIScrollView
- iOS 6编程-UIScrollView滚动视图和UIPageControl分页控件的简单应用
- UIScrollView的封装,实现定时滚动视图
- UIScrollView 滚动视图—IOS开发
- ios:让UIScrollView滚动时,其子视图位置不变
- iOS 6编程-UIScrollView滚动视图和UIPageControl分页控件实现图像分页显示
- UIScrollView 滚动视图—IOS开发