以下的代码其实也是存在很多不足的,但刚开始学习的时候可以拿来作为参考,后期有很好的开元库直接拿来使用。
需求:在界面上循环播放几张固定大小的图片,也可以通过手势滑动切换图片
1,代码实例化UIScrollView(也可以通过故事版或者xib来创建UI,但本文内容只讲解代码实现的情况)
2,for循环创建UIImageView并添加到UIScrollView
3,通过NSTimer实现循环播放UIScrollView
重点:
1.在创建滚动视图中的子视图的时候,要注意,第一个创建的子视图的坐标应该是从零开始的,之前出错的地方已经用红线标出
原理:
1.可以百度一下UIScrollView的原理,其实它就是一张很长的View或者很高的View,通过改变远点坐标的方式来显示滚动视图中的更多的内容
2.
self.timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
// 定时器 适合用来隔一段时间做一些间隔比较长的操作
// NSTimeInterval:多长多件操作一次
// target :操作谁
// selector : 要操作的方法
// userInfo: 传递参数
// repeats: 是否重复
代码:
//
// ViewController.m
// Scroll_01
//
// Created by kenshin on 15-8-22.
// Copyright (c) 2015年 kenshin. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;//滚动视图容器
@property (nonatomic, strong) UIPageControl *pageControl;//显示滚动视图显示的当前“页”其实滚动视图是“一张很长的View”
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30, 20, 320, 440)];
//设置内容的滚动范围
[_scrollView setContentSize:CGSizeMake(320 * 6, 0)];
//开启滚动分页功能,如果不需要这个功能可以关闭
[_scrollView setPagingEnabled:YES];
//隐藏横向与纵向的滚动条
[_scrollView setShowsVerticalScrollIndicator:NO];
[_scrollView setShowsHorizontalScrollIndicator:NO];
//在本类中代理scrollView的整体事件
[_scrollView setDelegate:self];
//切记!for循环里面的从表是从0开始算起的,之前i从1开始,结果导致第一张图的坐标从320开始算起了,于是第一张图片显示在了scrollView的320,0的位置
for (int i = 0; i < 6; i ++)
{
NSLog(@"%d", i);
//这里给每一个ScrollView添加一个图片和一个按钮
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * 320, 0, 320, 340)];
NSString *imgs = [[NSString alloc] initWithFormat:@"%d.png",i+1];
[imageView setImage:[UIImage imageNamed:imgs]];
//把每页需要显示的View添加进ScrollerView
[_scrollView addSubview:imageView];
}
//整体再将ScrollView显示在窗口中
[self.view addSubview:_scrollView];
//页面控制小工具
//它会在底部绘制小圆点标志当前显示页面
_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 330, self.view.frame.size.width, 20)];
//设置页面的数量
[_pageControl setNumberOfPages:6];
//监听页面是否发生改变
[_pageControl addTarget:self action:@selector(changePage:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:_pageControl];
//开启定时器?
[self addTimer];
}
- (void)changePage:(id)sender
{
NSLog(@"-------------------页面发生了改变");//该方法没有被调用
}
//手指离开屏幕后ScrollView还会继续滚动一段事件直到停止
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSLog(@"结束滚动后缓冲滚动彻底结束时调用");
NSLog(@"视图宽度:%f", scrollView.contentOffset.x);
NSLog(@"frame宽度:%f", self.view.frame.size.width);
}
- (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
NSLog(@"结束滚动后开始缓冲滚动时调用");
}
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
//页面滚动时调用【scrollView.contentOffset.x== 滚动视图的总宽度, 320== 单个图片的宽度】
[_pageControl setCurrentPage:fabs(scrollView.contentOffset.x/320.f)];
}
//开始滚动的时候调用
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
//关闭定时器【注意:定时器一旦被关闭,无法再开启】
[self removeTimer];
NSLog(@"开始滚动时调用moving。。。。。");
}
- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
NSLog(@"即将结束滚动时调用ending。。。。。");
//开启定时器
[self addTimer];
}
/*开启定时器*/
- (void)addTimer
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
}
//关闭定时器
- (void)removeTimer
{
[self.timer invalidate];
}
- (void)nextImage
{
int page = (int)self.pageControl.currentPage;
if(page == 6)
{
page = 0;
}
else
{
page++;
if(page == 6)
{
page = 0;
}
}
//滚动scrollView
CGFloat x = page * self.scrollView.frame.size.width;
self.scrollView.contentOffset = CGPointMake(x, 0);
}
@end