UIScrollView,UIPageControl,UIImageView 实现图片轮播的效果
上一篇博客介绍了如何将XCode创立的项目提交到Git版本控制,这次就直接做一个图片轮播的展示demo,刚好可以把UIScrollView、UIPageControl、UIImageView这三个控件讲解分析一下。先上效果,这样比较直观。

从图中可以看到这个界面是由UIImageView 和 UITableView 组合而成。在这里UITableView的内容不作为本次讲解的重点,如果对UITableView的使用有疑问的,可以留言给我。下面就进入正题,在头文件创建几个变量。
@interface ScrollImageViewController : UIViewController<UIScrollViewDelegate>
{
BOOL isFromStart;
}
@property(nonatomic, strong)UIScrollView *scrollView; //声明一个UIScrollView
@property(nonatomic, strong)UIPageControl *pageControl; //声明一个UIPageControl
@property(nonatomic, strong)NSArray *arrayImages; //存放图片的数组
@property(nonatomic, strong)NSMutableArray *viewController; //存放UIViewController的可变数组
@end
下面在.m文件中创建这些声明变量
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.arrayImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"3201.jpg"],[UIImage imageNamed:@"3202.jpg"],[UIImage imageNamed:@"3203.jpg"],[UIImage imageNamed:@"3204.jpg"], nil];
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width,ImageHeight)];
[_scrollView setPagingEnabled:YES];
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.showsVerticalScrollIndicator = NO;
[_scrollView setDelegate:self];
[_scrollView setBackgroundColor:[UIColor lightGrayColor]];
//ContentSize 这个属性对于UIScrollView挺关键的,取决于是否滚动。
[_scrollView setContentSize:CGSizeMake(CGRectGetWidth(self.view.frame) * [self.arrayImages count], ImageHeight)];
[self.view addSubview:_scrollView];
_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(, self.scrollView.frame.size.height - , , )];
[_pageControl setBackgroundColor:[UIColor blackColor]];
_pageControl.currentPage = ;
_pageControl.numberOfPages = [self.arrayImages count];
[_pageControl addTarget:self action:@selector(chagePage:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:_pageControl];
_viewController = [[NSMutableArray alloc] init];
; i < [self.arrayImages count]; i++) {
[_viewController addObject:[NSNull null]];
}
_timer = [NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(scrollPages) userInfo:nil repeats:YES];
[self loadScrollViewPage:];
[self loadScrollViewPage:];
[self loadScrollViewPage:];
[self loadScrollViewPage:];
}
下面是实现loadScrollViewPage的方法,因为这里用到了定时器的自动滚动,所以在viewDidLoad里面把所有的图片都自动装载进去了。
-(void)loadScrollViewPage:(NSInteger)page
{
if (page >= self.arrayImages.count) {
return;
}
UIViewController *imageViewController = [self.viewController objectAtIndex:page];
if ((NSNull *)imageViewController == [NSNull null])
{
imageViewController = [[UIViewController alloc] init];
[self.viewController replaceObjectAtIndex:page withObject:imageViewController];
}
if (imageViewController.view.superview == nil) {
CGRect frame = self.scrollView.frame;
frame.origin.x = CGRectGetWidth(frame) * page;
frame.origin.y = ;
imageViewController.view.frame = frame;
//[self addChildViewController:imageViewController];
[self.scrollView addSubview:imageViewController.view];
[imageViewController didMoveToParentViewController:self];
[imageViewController.view setBackgroundColor:[UIColor colorWithPatternImage:(UIImage *)[self.arrayImages objectAtIndex:page]]];
}
}
接下来的工作就是要实现UIScrollView的委托方法,实现横向滚动来切换到下一图片,以及UIPageControl 切换图片的方法,先看看scrollViewDidEndDecelerating的方法声明吧。
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = CGRectGetWidth(self.scrollView.frame);
NSInteger page = floor((self.scrollView.contentOffset.x -pageWidth/)/pageWidth) +;
self.pageControl.currentPage = page;
[self loadScrollViewPage:page-];
[self loadScrollViewPage:page];
[self loadScrollViewPage:page+];
}
然后就是UIPageControl的changePage 方法。
- (IBAction)changePage:(id)sender
{
NSInteger page = self.pageControl.currentPage;
[self loadScrollViewPage:page - ];
[self loadScrollViewPage:page];
[self loadScrollViewPage:page + ];
CGRect bounds = self.scrollView.bounds;
bounds.origin.x = CGRectGetWidth(bounds) * page;
bounds.origin.y = ;
[self.scrollView scrollRectToVisible:bounds animated:YES];
}
最后的任务就是要完成在viewDidLoad里面对NSTimer声明的切换图片的方法。
-(void)scrollPages{
++self.pageControl.currentPage;
CGFloat pageWidth = CGRectGetWidth(self.scrollView.frame);
if (isFromStart) {
[self.scrollView setContentOffset:CGPointMake(, ) animated:YES];
self.pageControl.currentPage = ;
}
else
{
[self.scrollView setContentOffset:CGPointMake(pageWidth*self.pageControl.currentPage, self.scrollView.bounds.origin.y)];
}
) {
isFromStart = YES;
}
else
{
isFromStart = NO;
}
}
以上就是实现效果图中所需要的代码了。制作这个demo的时候参照了SDK里面的PageControl的代码,然后自己动手加工完成的。
参考文献:
https://developer.apple.com/library/ios/#samplecode/PageControl/Introduction/Intro.html
UIScrollView,UIPageControl,UIImageView 实现图片轮播的效果的更多相关文章
- iOS开发UI篇—UIScrollView控件实现图片轮播
iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: #import "YYV ...
- 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播
原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...
- JQuery图片轮播滚动效果(网页效果--每日一更)
今天,带来的是一个图片的轮播滚动效果! 先来看一下效果展示:亲,请点击这里 原理很简单,设置一个定时器,使图片列表在每隔一段时间后滚动一次.而循环效果,就是在每一滚动的时候,将第一张图片放到最后一张的 ...
- Js 图片轮播渐隐效果
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 图片轮播展示效果-2D实现
图片的轮播展示效果如果使用2D实现,需要将3D中存在的近大远小效果使用图片的缩放呈现,因此需要存储和计算图片的位置同时还要计算存储图片的缩放信息.将所有图片的位置连线看作是一个椭圆,就可以根据图片的个 ...
- UIScrollView控件实现图片轮播
http://www.cnblogs.com/dyf520/p/3805297.html 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 1 ...
- 【原创smarty仿淘宝商品图片轮播+放大镜效果】
1.去掉图片集字段,字符串的多余字符 $goods_pic_display=$row[DISPLAY];$goods_pic_display1=str_replace('"', '', $g ...
- H5+CSS3做图片轮播滚动效果
HTML代码部分: <div id="wrap"> <ul id="list"> <li>10</li> < ...
- UIScrollView实现图片轮播器及其无限循环效果
图片轮播器: 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" ...
随机推荐
- html中submit和button的区别/ window.location.href 不跳转 的问题
<input type="button"> <input type="submit"> 这两个的区别 是 button 不会自动提交表 ...
- 【OpenWRT】【RT5350】【二】烧写OpenWrt到RT5350开发板
烧写bin文件到开发板的方式有很多种,我采用的是通过web页面直接上传文件的方式 首先通过浏览器登陆路由器(192.168.1.1),作者的开发板已经烧好了OpenWrt并且可以通过Luci登陆,所以 ...
- linux命令日常总结
1.date 显示系统日期2. mkdir xx 创建xx目录 rmdir xx 删除xx目录(空目录) rm -rf xx 删除xx目录(非空目录) 3. vi xx 创建某文件 写入-->e ...
- jquery easyui-datagrid/treegrid 清空数据参考
在使用easyui的treegrid或datagrid的过程经常会有这样的场景,如:需要按不同的类型加载数据时,如果选择的分类下没有数据应该把上次展示的数据清空,以免引用歧义.下面给出两种方法供初学者 ...
- linux查看某个进程内存占用情况以及/proc/pid/status解释
以nginx 为例1.toptop -b -n 1 |grep nginx|awk '{print "VIRT:"$5,"RES:"$6,"cpu:& ...
- PostgreSQL installations
[root@test02 init.d]# ll /etc/init.d/postgresql-9.5 -rwxr-xr-x. 1 root root 10072 May 15 06:34 /etc/ ...
- com.caucho.hessian.io.HessianProtocolException: is unknown code 解决方案
问题: Cannot access Hessian remote service at [http://....../remote/syllabusService]; nested exception ...
- C#如何实现下载文件保存到本地上面去
public void btnTemplate_Click(object sender, EventArgs e) { string strResult = string.Empty; string ...
- 第二天 ado.net, asp.net ,三层笔记
1. ado.net步骤: 一:倒入命名空间 using System.Data; using System.Data.sqlclient; 二:第一个模型 int ...
- Apache2.4开启GZIP功能
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的 ...