UIScrollView和UIPageControl学习使用
UIScrollView和UIPageControl
概要
对于同一个页面需要展示很多图片信息、子视图等的这样的需求,我们可以采用控件UIScrollVIew,与之常常一起使用的控件是UIPageControl,UIScrollVIew里面可以存放多个子视图,通过设置页模式,以及子页面在UIScrollVIew的content位置,可以在滑动控件UIScrollVIew的时候切换子视图。为了交互友好,常常和控件UIPageControl一起使用,该控件是一组指示器,一般指示器个数对应于上述的子页面个数,通过改组指示器可以看到当前子页面的位置以及整个UIScrollVIew的子视图情况。
结果展示

主要技术点
UIScrollVIew是存放需要显示的界面的,UIPageControl指示的是UIScrollVIew的子视图信息,包括当前页、总页数要使得
UIScrollVIew支持页模式需要将属性pagingEnabled设为YES,这样滚动都是按页滚动的往
UIScrollVIew添加页(子视图)的时候需要知道,因为该控件的分页和翻页是根据content区域构建的,所以每个页都有自己的页区域,而且这些也一般设为连续的,所以记得设置子页的frame为content的某区域,而且UIScrollVIew的content要刚好容纳子页。如果content过大,导致子页翻完了,还能翻到空白区;小了,则部分视图不会显示了。一开始我通过重写方法
- (void) addSubview:(UIView *)view添加子页的,不过发现UIScrollVIew子页数不对,后来才发现有程序自动调用了该方法,导致子页数不对(好像多了两个子页)。所以后来修改方法为- (void) addSubview:(UIView *)view forCurrent:(BOOL)current。为了能够手动设置控件
UIScrollVIew显示的子页,需要使用方法scrollRectToVisible:animated:,其中rect是指子页的位置,如CGRect rect = CGRectMake(page*_pageSize.width, 0, _pageSize.width, _pageSize.height); /** 移到可视区 */
[self scrollRectToVisible:rect animated:animated];
为了更新控件
UIScrollVIew和UIPageControl,需要给他们分别设置代理和方法。给控件UIScrollVIew设置代理,同时实现方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView;给控件UIPageControl添加方法- (void) onChangePage,如:#pragma 实现协议UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSInteger page = scrollView.contentOffset.x / _pageView.pageSize.width; if(page != _pageController.currentPage)
{
_pageController.currentPage = page;
};
} - (void) onChangePage
{
[_pageView setCurrentPage:_pageController.currentPage animated:YES];
}
主要代码
自定义的UIScrollView
//
// PageView.m
// PageView 继承自 UIScrollView
//
// Created by arbboter on 14/12/24.
// Copyright (c) 2014年 arbboter. All rights reserved.
//
#import "PageView.h"
@interface PageView ()
@end
@implementation PageView
- (id) initWithFrame:(CGRect)frame
{
if(self=[super initWithFrame:frame])
{
/** 页模式 */
self.pagingEnabled = YES;
self.pageSize = frame.size;
}
return self;
}
/* 默认的addSubview:方法会被调用, 所以为了区分所需的添加照片,重载或者定义其他方法 */
- (void) addSubview:(UIView *)view forCurrent:(BOOL)current
{
NSInteger nPage = [self.subviews count];
/** 新添加的子页都对应content的某个区域 */
view.frame = CGRectMake(nPage*_pageSize.width, 0, _pageSize.width, _pageSize.height);
nPage++;
self.contentSize = CGSizeMake(nPage*_pageSize.width, _pageSize.height);
[super addSubview:view];
if(current)
{
[self setCurrentPage:nPage-1 animated:NO];
}
}
/** 设置页面page可见,需要把视图的content的对应部分移到可视区 */
- (void) setCurrentPage:(NSInteger)page animated:(BOOL)animated
{
if(page >= [self.subviews count])
{
return;
}
CGRect rect = CGRectMake(page*_pageSize.width, 0, _pageSize.width, _pageSize.height);
/** 移到可视区 */
[self scrollRectToVisible:rect animated:animated];
}
@end
程序控制类
//
// ViewController.m
// PageView
//
// Created by arbboter on 14/12/24.
// Copyright (c) 2014年 arbboter. All rights reserved.
//
#import "ViewController.h"
#import "PageView.h"
@interface ViewController () <UIScrollViewDelegate>
@property (nonatomic, retain) PageView* pageView;
@property (nonatomic, retain) UIPageControl* pageController;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CGRect frame = self.view.frame;
PageView* scrollView = [[PageView alloc] initWithFrame:frame];
self.pageView = scrollView;
/** 设置代理,使得视图滚动时更新其他控件 */
scrollView.delegate = self;
[self.view addSubview:scrollView];
[scrollView release];
frame.origin.y += frame.size.height*7/8;
frame.size.height = frame.size.height/8;
UIPageControl* pageCtrl = [[UIPageControl alloc] initWithFrame:frame];
self.pageController = pageCtrl;
/** 非当前页的指示器颜色 */
pageCtrl.pageIndicatorTintColor = [UIColor blueColor];
/** 当前页的指示器颜色 */
pageCtrl.currentPageIndicatorTintColor = [UIColor greenColor];
[self.view insertSubview:pageCtrl aboveSubview:self.pageView];
/** 页面指示器变化时,scroll更新 */
[pageCtrl addTarget:self action:@selector(onChangePage) forControlEvents:UIControlEventValueChanged];
[pageCtrl release];
/** 加载图片 */
int nImage = 8;
NSString* imageName = nil;
for (int i=0; i<nImage; i++)
{
imageName = [[NSString alloc] initWithFormat:@"%d.jpg", i+1];
UIImageView* imageView = [[UIImageView alloc] initWithFrame:self.pageView.frame];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = [UIImage imageNamed:imageName];
imageView.backgroundColor = [UIColor colorWithRed:(arc4random()%30)/100 green:(arc4random()%30)/100 blue:(arc4random()%30)/100 alpha:1.0];
[self.pageView addSubview:imageView forCurrent:NO];
[imageView release];
[imageName release];
}
/** 设置页指示器总个数 */
self.pageController.numberOfPages = [self.pageView.subviews count];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma 实现协议UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSInteger page = scrollView.contentOffset.x / _pageView.pageSize.width;
if(page != _pageController.currentPage)
{
_pageController.currentPage = page;
};
}
- (void) onChangePage
{
[_pageView setCurrentPage:_pageController.currentPage animated:YES];
}
@end
项目工程
UIScrollView和UIPageControl学习使用的更多相关文章
- UI:UIScrollView、UIPageControl
一.UIScrollView的常⽤用属性 二.UIScrollView的常⽤用代理方法 三.UIPageControl的使⽤用 四.UIPageControl与UIScrollView的结合使⽤用 U ...
- 使用UIScrollView和UIPageControl做一个能够用手势来切换图片的效果
利用UIScrollView的滚动效果来实现,先上图: 实现过程是:在viewController里先增加UIScrollView和UIPageControl: -(void) loadView { ...
- iOS:UI系列之UIScrollview和UIPagecontrol
转眼间,又是一天,就这样忙忙碌碌的一天一天的过着, 不过还好,不是浑浑噩噩的,也算是小有所成,劳有所获吧,嘿嘿! 好了,到了总结的时间啦, 下面就为大家简单讲解下我今天学习的内容吧,希望对各位都有所帮 ...
- iOS开发 首次启动显示用户引导,第二次启动直接进入App,UIScrollView,UIPageControl,NSUserDefaults
首先创建一个引导图的控制器类 UserGuideViewController.h和UserGuideViewController.m #import <UIKit/UIKit.h> #im ...
- UIscrollView和UIPageControl的循环滚动
因为昨天在网上找了很久,很多只能实现向右滚动,而且一张图一个imageview ,感觉工作量很可怕啊 , 下面的例子就是不论你多少图 , 只和我代码里面的几个数值有关, 只需要修改分页和循环i的最 ...
- iOS— UIScrollView和 UIPageControl之间的那些事
本代码主要实现在固定的位置滑动图片可以切换. 目录图如下: ViewController.h #import <UIKit/UIKit.h> // 通过宏定义定义宽和高 #define W ...
- IOS 欢迎页(UIScrollView,UIPageControl)
本文介绍了app欢迎页的简单实现.只有第一次运行程序时才说会出现,其余时间不会出现.下面是效果图. 代码如下:(如有不明白的可以评论我,我会详细讲解) // // ViewController.m / ...
- UIScrollView -2(UIScrollView 与 UIPageControl的使用): 分页查看图片
1.初始化UIScrollView 2.设置初始化出来的UIScrollView的contentSize: myscrollview.contentSize =CGSizeMake(CGRectGet ...
- 利用UIScrollView和UIPageControl实现多页图片欢迎页面
在.h文件当中实现UIScrollViewDelegate协议,让控制器充当代理: #import <UIKit/UIKit.h> @interface RPRootViewControl ...
随机推荐
- struts.custom.i18n.resources国际化详解(一)
每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化 首先在struts.properties文件中加入以下内容:struts.custom ...
- 织梦dedecms返回上一级链接代码
如题:织梦dede手机页面,如果我进入了下一级页面,想回上一级,<a href="xx">该用什么标签? 用JS实现,代码如下 <a href="jav ...
- ecstore使用paypal支付显示不支持此支付
问题描述: ecstore使用paypal支付,下单结算时显示不支持此支付. 问题和代码分析: 1.首先必须要保证默认货币是paypal支持的货币,paypal目前支付 ["supportC ...
- destoon实现商铺管理主页设置增加新菜单的方法
1.打开/lang/zh-cn/home.inc.php,找到9,10行替换如下: $HMENU = $DMENU = array('公司介绍', '供应产品', '采购清单', '新闻中心', '荣 ...
- 基于ViewPager的一些酷炫切换效果
1.ViewPager可以用于实现类似banner的功能,我曾经在“时间超市”项目中使用过.但如何在此基础上实现一些切换的酷炫效果呢?今天细细品读了鸿洋大神的相关博文,终于学会了如何自定义切换效果. ...
- MongoDB备份数据库&导入数据库
今天需要对线上的MongoDB中的webpage库进行备份,然后在本地导入备份的库. 1.备份整个MongoDB数据库 mongodump -h dbhost --port 端口 -u 用户名 -p ...
- Java中的日期处理类
在Java中可以使用Date类和Calendar类来处理日期 但是Date类很多方法都过时了,推荐使用Canlendar类来处理日期,并对日期的格式化做了介绍.下面的部分将会逐一介绍 Date类 Ja ...
- [TYVJ] P1015 公路乘车
公路乘车 描述 Description 一个特别的单行街道在每公里处有一个汽车站.顾客根据他们乘坐汽车的公里使来付费.例如样例的第一行就是一个费用的单子. 没有一辆车子行驶超过10公里,一个顾客打算行 ...
- ubuntu下查看IP Gateway DNS信息
使用nm-tool命令 在最底下有一行: IPv4 Settings: Address: 192.168.0.166 Prefix: (255.255.255.0) Gateway: 192.168. ...
- Hdu5737-Differencia(有序表线段树)
题意很直观,我就不说了. 解析:这是我以前没有接触过的线段树类型,有序表线段树,每个节点申请了两段空间,主要是为了保存左边儿子会有多少比v小的,右边儿子会有多少比v小 的,所以在建树过程中要归并排序. ...