UIScrollView和UIPageControl结合实现图片浏览
2015-02-14 23:36
507 查看
iOS中具有图片类的app通常都会有滑动浏览的功能,许多app第一次启动时,也会用UIScrollView+UIPageControl来展示新功能。今天探索一下如何实现该功能。
首先介绍下UIScrollView,UIScrollView中有个重要的属性是contentSize,用于界定滑动范围的大小。UIScrollView本身frame是我们在屏幕上可视部分,也就是说contentSize的宽要大于UIScrollView.frame.size.width才能实现滑动浏览的功能。
另外,图片浏览,为了避免一开始就load所有的UIImageView,可以选择仅仅load当前浏览页面及前后三个UIImageView。而这之外的page上的子视图我们都设置为[NSNullnull]。我们在检测到滑动后,再lazyload所需的UIImageView。
#import"ViewController.h"
@interfaceViewController()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView*scrollView;
@property(nonatomic,strong)UIPageControl*pageControl;
@property(nonatomic,strong)NSArray*pageImages;
@property(nonatomic,strong)NSMutableArray*pageViews;
-(void)loadVisiblePages;
-(void)loadPage:(NSInteger)page;
-(void)purgePage:(NSInteger)page;
@end
@implementationViewController
@synthesizescrollView;
@synthesizepageControl;
@synthesizepageImages;
@synthesizepageViews;
-(void)viewDidLoad{
[superviewDidLoad];
//1
pageImages=[NSArrayarrayWithObjects:[UIImageimageNamed:@"2.jpg"],
[UIImageimageNamed:@"5.jpg"],[UIImageimageNamed:@"2.jpg"],[UIImageimageNamed:@"5.jpg"],nil];
NSIntegerpageCount=pageImages.count;
pageViews=[[NSMutableArrayalloc]init];
for(NSIntegeri=0;i<pageCount;i++){
[self.pageViewsaddObject:[NSNullnull]];
}
//2
self.scrollView=[[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,320,568)];
[self.viewaddSubview:scrollView];
scrollView.delegate=self;
self.pageControl=[[UIPageControlalloc]initWithFrame:CGRectMake(0,400,320,20)];
self.pageControl.currentPage=0;
[self.pageControlsetNumberOfPages:pageCount];
[pageControlsetBackgroundColor:[UIColorgrayColor]];
[self.viewaddSubview:pageControl];
}
-(void)viewDidAppear:(BOOL)animated{
[superviewDidAppear:animated];
CGSizepagesScrollViewSize=self.scrollView.frame.size;
self.scrollView.contentSize=CGSizeMake(pagesScrollViewSize.width*self.pageImages.count,pagesScrollViewSize.height);
[selfloadVisiblePages];
}
-(void)loadVisiblePages{
CGFloatpageWidth=scrollView.frame.size.width;
NSIntegerpage=(NSInteger)floor((self.scrollView.contentOffset.x*2.0f+pageWidth)/(pageWidth*2.0f));
pageControl.currentPage=page;
NSIntegerfirstPage=page-1;
NSIntegerlastPage=page+1;
//Pureanythingbeforethefirstpage
for(NSIntegeri=0;i<firstPage;i++){
[selfpurgePage:i];
}
//Loadpagesinourrange
for(NSIntegeri=firstPage;i<=lastPage;i++){
[selfloadPage:i];
}
//Purgeanythingafterlastpage
for(NSIntegeri=lastPage+1;i<self.pageImages.count;i++){
[selfpurgePage:i];
}
}
-(void)loadPage:(NSInteger)page{
if(page<0||page>=self.pageImages.count){
return;
}
UIView*pageView=[self.pageViewsobjectAtIndex:page];
if((NSNull*)pageView==[NSNullnull]){
CGRectframe=self.scrollView.bounds;
frame.origin.x=frame.size.width*page;
frame.origin.y=0.0f;
UIImageView*imageView=[[UIImageViewalloc]initWithImage:[self.pageImagesobjectAtIndex:page]];
imageView.contentMode=UIViewContentModeScaleAspectFit;
imageView.frame=frame;
[self.scrollViewaddSubview:imageView];
[self.pageViewsreplaceObjectAtIndex:pagewithObject:imageView];
}
}
-(void)purgePage:(NSInteger)page{
if(page<0||page>=self.pageImages.count){
//Ifit'soutsidetherangeofwhatyouhavetodisplay,thendonothing
return;
}
//Removeapagefromthescrollviewandresetthecontainerarray
UIView*pageView=[self.pageViewsobjectAtIndex:page];
if((NSNull*)pageView!=[NSNullnull]){
[pageViewremoveFromSuperview];
[self.pageViewsreplaceObjectAtIndex:pagewithObject:[NSNullnull]];
}
}
#pragmamark-ScrollViewdelegate
-(void)scrollViewDidScroll:(UIScrollView*)scrollView{
[selfloadVisiblePages];
}
几个注解:
-判断当前页面是第几个页面时,我们通过UIScrollView.contentOffset.x和pageWidth来判断,这里有一点数学上的运算。
-为了监测scrollView滑动的变化,设置scrollView的delegate,并且实现delegate中scrollViewDidScroll:方法。
首先介绍下UIScrollView,UIScrollView中有个重要的属性是contentSize,用于界定滑动范围的大小。UIScrollView本身frame是我们在屏幕上可视部分,也就是说contentSize的宽要大于UIScrollView.frame.size.width才能实现滑动浏览的功能。
另外,图片浏览,为了避免一开始就load所有的UIImageView,可以选择仅仅load当前浏览页面及前后三个UIImageView。而这之外的page上的子视图我们都设置为[NSNullnull]。我们在检测到滑动后,再lazyload所需的UIImageView。
#import"ViewController.h"
@interfaceViewController()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView*scrollView;
@property(nonatomic,strong)UIPageControl*pageControl;
@property(nonatomic,strong)NSArray*pageImages;
@property(nonatomic,strong)NSMutableArray*pageViews;
-(void)loadVisiblePages;
-(void)loadPage:(NSInteger)page;
-(void)purgePage:(NSInteger)page;
@end
@implementationViewController
@synthesizescrollView;
@synthesizepageControl;
@synthesizepageImages;
@synthesizepageViews;
-(void)viewDidLoad{
[superviewDidLoad];
//1
pageImages=[NSArrayarrayWithObjects:[UIImageimageNamed:@"2.jpg"],
[UIImageimageNamed:@"5.jpg"],[UIImageimageNamed:@"2.jpg"],[UIImageimageNamed:@"5.jpg"],nil];
NSIntegerpageCount=pageImages.count;
pageViews=[[NSMutableArrayalloc]init];
for(NSIntegeri=0;i<pageCount;i++){
[self.pageViewsaddObject:[NSNullnull]];
}
//2
self.scrollView=[[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,320,568)];
[self.viewaddSubview:scrollView];
scrollView.delegate=self;
self.pageControl=[[UIPageControlalloc]initWithFrame:CGRectMake(0,400,320,20)];
self.pageControl.currentPage=0;
[self.pageControlsetNumberOfPages:pageCount];
[pageControlsetBackgroundColor:[UIColorgrayColor]];
[self.viewaddSubview:pageControl];
}
-(void)viewDidAppear:(BOOL)animated{
[superviewDidAppear:animated];
CGSizepagesScrollViewSize=self.scrollView.frame.size;
self.scrollView.contentSize=CGSizeMake(pagesScrollViewSize.width*self.pageImages.count,pagesScrollViewSize.height);
[selfloadVisiblePages];
}
-(void)loadVisiblePages{
CGFloatpageWidth=scrollView.frame.size.width;
NSIntegerpage=(NSInteger)floor((self.scrollView.contentOffset.x*2.0f+pageWidth)/(pageWidth*2.0f));
pageControl.currentPage=page;
NSIntegerfirstPage=page-1;
NSIntegerlastPage=page+1;
//Pureanythingbeforethefirstpage
for(NSIntegeri=0;i<firstPage;i++){
[selfpurgePage:i];
}
//Loadpagesinourrange
for(NSIntegeri=firstPage;i<=lastPage;i++){
[selfloadPage:i];
}
//Purgeanythingafterlastpage
for(NSIntegeri=lastPage+1;i<self.pageImages.count;i++){
[selfpurgePage:i];
}
}
-(void)loadPage:(NSInteger)page{
if(page<0||page>=self.pageImages.count){
return;
}
UIView*pageView=[self.pageViewsobjectAtIndex:page];
if((NSNull*)pageView==[NSNullnull]){
CGRectframe=self.scrollView.bounds;
frame.origin.x=frame.size.width*page;
frame.origin.y=0.0f;
UIImageView*imageView=[[UIImageViewalloc]initWithImage:[self.pageImagesobjectAtIndex:page]];
imageView.contentMode=UIViewContentModeScaleAspectFit;
imageView.frame=frame;
[self.scrollViewaddSubview:imageView];
[self.pageViewsreplaceObjectAtIndex:pagewithObject:imageView];
}
}
-(void)purgePage:(NSInteger)page{
if(page<0||page>=self.pageImages.count){
//Ifit'soutsidetherangeofwhatyouhavetodisplay,thendonothing
return;
}
//Removeapagefromthescrollviewandresetthecontainerarray
UIView*pageView=[self.pageViewsobjectAtIndex:page];
if((NSNull*)pageView!=[NSNullnull]){
[pageViewremoveFromSuperview];
[self.pageViewsreplaceObjectAtIndex:pagewithObject:[NSNullnull]];
}
}
#pragmamark-ScrollViewdelegate
-(void)scrollViewDidScroll:(UIScrollView*)scrollView{
[selfloadVisiblePages];
}
几个注解:
-判断当前页面是第几个页面时,我们通过UIScrollView.contentOffset.x和pageWidth来判断,这里有一点数学上的运算。
-为了监测scrollView滑动的变化,设置scrollView的delegate,并且实现delegate中scrollViewDidScroll:方法。
相关文章推荐
- UIScrollView和UIPageControl结合实现简单图片浏览
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView+UIpageControl实现图片的循环滚动切换
- UIScrollView和UIPageControl 实现让图片无限循环播放和左右滑动
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView 和UIPageControl结合实现分页
- UIScrollView+UIPageControl实现图片分页
- IOS基础UI之(九) UIPageControl结合UIScrollView实现分页效果
- UIScrollView和UIPageControl实现图片切换
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView+UIPageControl+NSTimer 图片自动滚动的两种实现方法
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 利用UIScrollView和UIPageControl实现图片切换
- 【iOS系列】-UIScrollView的介绍及结合UIPageControl实现图片播放的实例
- iOS做一个iPhone相册,每个图片都能放大缩小并且翻到第⼆张图时,再翻回来就变成原来的大 ⼩.使⽤UIPageControl与UIScrollView结合.
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 【转载】通过UIPageControl+UIScrollView实现图片循环轮播(原理解释的很详细)
- [IOS]通过UIPageControl+UIScrollView实现图片循环轮播
- UIScrollView+UIpageControl实现图片的循环滚动切换
- UI UIScrollView和UIPageControl的结合使用