才做了两个月的IOS开发,从一个材料专业的学生,变为菜鸟程序员,对软件也产生了兴趣,最近在做一个项目,希望自己能够把项目中的东西记下来(毕竟是处女作),要把做过的与大家分享一下:
对于这个项目首先就是研究了一下:UIPageControl and UIScrollView 来制作一个定时滑动的图片,并且增加手势功能。
首先给出.h代码:
//
// ViewController.h
// ScrollViewDemo
//
// Created by duostec on 13-9-21.
年
//
#import <UIKit/UIKit.h>
@interface ScrollAndPageController :UIViewController<UIScrollViewDelegate,UIGestureRecognizerDelegate>
{
BOOL
UIPageControl
NSInteger picNum;//用于计算一共有多少张图片
NSArray *imageNames;//用于存放一组图片的名字
UIScrollView *scroll;//定义UIScrollView
}
NSInteger) picNums andImageName:(NSArray
@end
其中实现了两个代理,第一个是:UIScrollViewDelegate 其中的代理方法
void)scrollViewDidScroll:(UIScrollView
UIGestureRecognizerDelegate 其中的代理方法其中的一些方法与手势有关,但此程序好像用处不大;
写完了.h文件接下来是.m文件
//
// ViewController.m
// ScrollViewDemo
//
// Created by duostec on 13-9-21.
年
//
#import "ScrollAndPageController.h"
640,1136), [[UIScreen mainScreen] currentMode].size) : NO)
@interface ScrollAndPageController ()
@end
@implementation
-(id)initWithImageNumber:(NSInteger) picNums andImageName:(NSArray
{
if(self = [superinit]){
picNum
imageNames
}
return self;
}
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
scroll = [[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,310,120)];
//定义scrollView 的显示大小
/*
*scrollView有显示区域大小和内容区域大小之分
*两者的区别在于,显示是用户可以看到的区域,而内容区域则是存放多个显示区域
*/
for (int i =0; i<picNum; i++)
{
UIImageView *newView = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:imageNames[i]]];//实例化一个ImageView用来作为图片的容器
setClipsToBounds:YES]; //当图片的大小大于ImageView时不显示多出
frame =CGRectMake(i*(310),0,310, 120);
/*
* 我要让多张图片在scrollView上横向滑动,所以关于x的起点坐标将会根据图片数量、以及图片的宽度有关
* scrollView的内容区域将随着图片数量的改变而改变,但是显示区域是一定的,就像透过窗户看黄河,河水是动的,窗户是静止的
*/
scrolladdSubview:newView];
}
scroll.contentSize =CGSizeMake(310*picNum,120);//这就是设置scrollView的内容视图大小
scroll.tag =101;
pageController = [[UIPageControlalloc]initWithFrame:CGRectMake(0,120,320, 20)]; //为pageControl实例化,初始化
scroll.pagingEnabled =YES; //以显示窗口为标准进行可翻页动作
scroll.scrollEnabled =YES//是否可以滑动
scroll.showsHorizontalScrollIndicator =NO; //不现实水平滚动轴
scroll.showsVerticalScrollIndicator =NO; //不现实垂直滚动轴
scroll.delegate =self;
[pageControllersetNumberOfPages:picNum]; //设置pageControl总页数,就是一共多少张图片就多少张页数
[pageControllersetCurrentPage:0];
pageController.backgroundColor = [UIColorgrayColor];
pageController.tag =102;
UIPanGestureRecognizer *tapRec = [[UIPanGestureRecognizeralloc]initWithTarget:self action: @selector(changePageByGes:)];//实例化手//势识别操作
delegate =self;
[pageController addTarget:self action:@selector(changePage:)forControlEvents:UIControlEventValueChanged];
self.view addSubview:scroll];
[self.view addSubview:pageController];//增加pageControl为子视图
[self.view addGestureRecognizer:tapRec];//为view增加手势
/*
-(void)changePageByGes:(UIPanGestureRecognizer *)rec方法
-(void)changePage:(UIPageControl *)pageChange方法
-(void)changePage
*/
if(picNum>1)
{
[NSTimerscheduledTimerWithTimeInterval:4target:selfselector:@selector(changePage)userInfo:nilrepeats:YES];
}
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)changePage:(UIPageControl
{
int witch = pageChange.currentPage;
[scroll setContentOffset:CGPointMake(witch*310,0)animated:YES];
/*
witch*310(因为图片是加载到ScrollView上的)
setContentOffset方法用来指定x,y偏移0,0位置的数量,可以NSLog一下就明白了
*/
}
-(void)changePage
{
/*
*此方法是用来定时滑动的flag用来判断滑动到了第一张还是最后一张,当到达了最后一张时应该向左滑动,当到达第一张时应该向右滑动
*/
if(pageController.currentPage ==0)
{
flag =YES;//如果当前的pageControll页数是第一张,flag为真
}
if(pageController.currentPage ==picNum-1)
{
flag =NO;//如果当前的PageControl页数是最后一张,flag为假
}
if(flag)
{
//当前的pageControl页数是第一张时,向右滑动
int witch =pageController.currentPage+1;
//pageController.currentPage = pageController.currentPage + 1 ;
[scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];
}
else
{
//当前的pageControll页数是最后一张时,向左滑动
int witch =pageController.currentPage-1;
//pageController.currentPage = pageController.currentPage -1;
[scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];
}
}
-(void)scrollViewDidScroll:(UIScrollView
{
/*
*这个scrollView的代理方法写的有些粗糙,以后待改进,三个if句只是为了判断当前的页数是不是大于等于零,小于最大图片数
*当滑动的偏移量转(当前页数)不在我们要求的范围内时,这个代理方法什么也不做
*/
UIPageControl *pageControl = (UIPageControl *)[self.viewviewWithTag:102];
UIScrollView *scroll0 = (UIScrollView *)[self.viewviewWithTag:101];
if ([scrollViewisEqual:scroll0])
{
staticint lastPageIndex =0;
CGFloat pageWidth = scrollView.frame.size.width;
NSInteger pageIndex =floor((scrollView.contentOffset.x - pageWidth /2) / pageWidth) +1; //此处就是通过计算scrollView的当前偏移量
if
{
if (pageIndex >=0 && pageIndex <=picNum-1)
{
setCurrentPage:pageIndex];//计算当前页数
lastPageIndex = pageIndex;
//NSLog(@"%.2f",scrollView.contentOffset.x);
}
}
}
}
-(void)changePageByGes:(UIPanGestureRecognizer
{
/*
*用于用户滑动PageControl时改变当前页数和显示的图片
*/
if(rec.state ==UIGestureRecognizerStateEnded) //判断手势动作的状态(要选择结束,也可以换成其他状态,但是效果会变不同)
{
CGPoint xPoint = [rectranslationInView:pageController];//通过translationInView来判断用户的左右滑动;
NSLog(@"%f-------------",xPoint.x);
if(xPoint.x >0) //向右
{
if(pageController.currentPage <picNum-1)
{
int witch =pageController.currentPage +1;
[scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];
pageController.currentPage
}
}
if(xPoint.x<0)//向左
{
if (pageController.currentPage >0)
{
int witch =pageController.currentPage -1;
[scrollsetContentOffset:CGPointMake(witch*310,0)animated:YES];
pageController.currentPage
}
}
}
}
@end
此处完-->下一节预习:答题页面UIPageViewController的转化以及代理