//已封装
//根视图控制器里初始化
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray* arr=[[NSMutableArray alloc]init];
for (int i=0; i<11; i++) {
NSString* path=[[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"%d",i+101] ofType:@"png"];
[arr addObject:path];
}
ScrollView *scroll=[[ScrollView alloc]initWithFrame:CGRectMake(20, 20, 280, 420) imagenames:arr];
[self.view addSubview:scroll];
[scroll release];
// Do any additional setup after loading the view.
}
//声明
#import <UIKit/UIKit.h>
@interface ScrollView : UIView<UIScrollViewDelegate>
{
UIScrollView *scroll;
}
@end
//实现部分
#import "Scroll.h"
@interface ScrollView ()
{
UIScrollView *scroll;
}
@property(nonatomic,retain)NSMutableArray *arr;
@property(nonatomic,retain)NSMutableArray *imagenames;
@end
@implementation ScrollView
int indexnum;//当前图片下标
CGFloat width;
CGFloat height;
- (id)initWithFrame:(CGRect)frame imagenames:(NSMutableArray*)imagename
{
self = [super initWithFrame:frame];
self.imagenames=[NSMutableArray arrayWithArray:imagename];//赋值用self.不能用_
width=self.frame.size.width;
height=self.frame.size.height-40;
indexnum=1;
if (self) {
//设置滑动视图属性
scroll=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, width, height)];
scroll.backgroundColor=[UIColor blueColor];
[self addSubview:scroll];
scroll.pagingEnabled=YES;
scroll.scrollsToTop=YES;
scroll.showsVerticalScrollIndicator=NO;
scroll.showsHorizontalScrollIndicator=NO;
scroll.delegate=self;
scroll.contentSize=CGSizeMake(width*3, height);
//循环加载图片
_arr=[[NSMutableArray alloc]init];
for (int i=0; i<3; i++) {
UIImageView *view=[[UIImageView alloc]initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:[_imagenames objectAtIndex:i]]]];
[_arr addObject:view];
view.frame=CGRectMake(i*width, 0, width, height);
[scroll addSubview:view];
[view release];
}
scroll.contentOffset=CGPointMake(width, 0);
[scroll release];
//定时器循环
// [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(p:) userInfo:nil repeats:YES];
// Initialization code
}
return self;
}
-(void)p:(NSTimer*)time//nstimer自动循环的方法
{
int k=scroll.contentOffset.x;
k+=width;
scroll.contentOffset=CGPointMake(k, 0);
// if用来判断用户是向左滑动还是向右滑动
if((scroll.contentOffset.x / width) == 0) {
// 向左划动时,当前显示的图片下标自减,并判断是否越界
indexnum--;
if(indexnum < 0) {
indexnum = _imagenames.count - 1;//最后一张图片
}
}else if((scroll.contentOffset.x / width) == 2) {
// 向右划动时,当前显示的图片下标自增,并判断是否越界
indexnum++;
if(indexnum > _imagenames.count - 1) {
indexnum = 0;//第一张图片
}
}
// 刷新中间的图片
[self refreshMiddleImage];
// 将视图移至中间
scroll.contentOffset=CGPointMake(width, 0);
// 刷新另外两个图片
[self refreshOtherImage];
}
//代理的两个方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
}// any offset changes//已经结束滑动时调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// if用来判断用户是向左滑动还是向右滑动
if((scrollView.contentOffset.x / width) == 0) {
// 向左划动时,当前显示的图片下标自减,并判断是否越界
indexnum--;
if(indexnum < 0) {
indexnum = _imagenames.count - 1;
}
}else if((scrollView.contentOffset.x / width) == 2) {
// 向右划动时,当前显示的图片下标自增,并判断是否越界
indexnum++;
if(indexnum > ([_imagenames count] - 1)) {
indexnum = 0;
}
}
// 刷新中间的图片
[self refreshMiddleImage];
// 将视图移至中间
scrollView.contentOffset=CGPointMake(width, 0);
// 刷新另外两个图片
[self refreshOtherImage];
}// called when scroll view grinds to a halt//已经停止减速时调用
// 刷新另外两个图片
- (void)refreshOtherImage {
// 刷新左边的图片
[(UIImageView*)[_arr objectAtIndex:0] setImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:[_imagenames objectAtIndex:indexnum==0?(_imagenames.count-1):(indexnum-1)]]]];
// 刷新右边的图片
[(UIImageView*)[_arr objectAtIndex:2] setImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:[_imagenames objectAtIndex:indexnum==(_imagenames.count-1)?0:(indexnum+1)]]]];
}
// 刷新中间的图片
- (void)refreshMiddleImage {
[(UIImageView*)[_arr objectAtIndex:1] setImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:[_imagenames objectAtIndex:indexnum]]]];
}
从代码优化的角度,使用 + (UIImage *)imageWithName:(NSString *)filePath 会占用系统的缓存空间,所以在加载图片的时候,推荐使用
+ (UIImage *)imageWithData : (NSData *)data 来加载图片.