您的位置:首页 > 产品设计 > UI/UE

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: