//RootViewController.m
// UISrollView
//UIScrollView是可以滚动的view,UIView本⾝不能滚动,子类UIScrollview拓展了滚动⽅面的功能。UIScrollView是所有滚动视图的基类。以后的UITableView,UITextView等视图都是继承于该类。使⽤场景:显⽰不下(单张大图);内容太多(图⽂混排);滚动头条(图⽚);相册等
//UIScrollView核⼼功能UIScrollview主要专长于两个⽅面:滚动:contentSize大于frame.size的时候,能够滚动。缩放:⾃带缩放,可以指定缩放倍数。
//contentSize 定义内容区域⼤小,决定是否能够滑动
//contentOffset 视图左上⾓距离坐标原点的偏移量
//scrollsToTop 滑动到顶部(点状态条的时候)
//pagingEnabled 是否整屏翻动
//bounces 边界是否回弹
//UIScrollView 滚动相关属性
//scrollEnabled 是否能够滚动
//showsHorizontalScrollIndicator 控制是否显示⽔平方向的滚动条
//showVerticalScrollIndicator 控制是否显⽰垂直方向的滚动条
//alwaysBounceVertical 控制垂直⽅向遇到边框是否反弹
//alwaysBounceHorizontal 控制⽔平⽅向遇到边框是否反弹
//UIScrollView 缩放相关属性
//minimumZoomScale 缩小的最⼩比例
//maximumZoomScale 放⼤的最⼤比例
//zoomScale 设置变化比例
//zooming 判断是否正在进行缩放反弹
//bouncesZoom 控制缩放的时候是否会反弹。要实现缩放,还需要实现delegate,指定缩放的视图是谁。
//UIPageControl
//UIPageControl从类名中可以看出,其父类是UIControl。
//currentPage 当前页
//numberOfPages 指定⻚面的个数
//所以可以像button一样添加事件,只不过事件触发使用的不是UIControlEventsTouchUpInside而是UIControlEventsValueChanged。
//UIPageControl和UIScrollView相结合pageControl与scrollview合⽤通常在Scrollview滚动的时候修改pageControl的currentPage使用场景:引导⻚⾸页的
// contentSize决定了scrollView能否滚动,contentOffset控制内容区域的偏移量,pageEnabled控制能否整⻚滚动。scrollView实现缩放需要指定最大缩放系数,最小缩放系数,并指定缩放的视图。pageControl不单独使用,通常与scrollView结合使用
/* 滚动代理方法
滚动就会触发
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
开始拖拽时触发
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
结束拖拽时触发
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
开始减速时触发
- (void)scrollViewWillBeginDecelerating:
(UIScrollView *)scrollView
结束减速时触发(停⽌止时)
- (void)scrollViewDidEndDecelerating:
(UIScrollView *)scrollView
UIScrollView 缩放代理方法delegate
完成放⼤缩⼩触发
- (void)scrollViewDidEndZooming:(UIScrollView*)scrollView withView:(UIView *)view atScale:(float)scale
指定某个UIScrollView的子视图可以被放⼤缩⼩
- (UIView *)viewForZoomingInScrollView:
(UIScrollView *)scrollView
*/
#import "RootViewController.h"
#import "SecondViewController.h"
@interface RootViewController()<UIScrollViewDelegate>
// 分别代表屏幕宽和高
#define ScreenWidthself.view.bounds.size.width
#define ScreenHeightself.view.bounds.size.height
@property (nonatomic,retain)UIScrollView*scrV;
@property (nonatomic,retain)UIPageControl*page;
@end
@implementation RootViewController
- (void)dealloc{
[_page release];
[_scrV release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
// 设置 UIScrollView 的视图大小,若内容尺寸(contentSize)大小大于UIScrollView的视图大小,则可以滚动。
self.scrV = [[UIScrollViewalloc]initWithFrame:[UIScreen mainScreen].bounds];
for (int i = 1; i < 5; i++) {
NSString *str = [NSString stringWithFormat:@"%d.png",i];
UIImage *image = [UIImage imageNamed:str];
UIImageView *imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(i * ScreenWidth,0, ScreenWidth, ScreenHeight)];
// 设置图片视图
imageView.image = image;
// 将图片视图作为滚动视图的contentSizeView。 (内容视图)
[self.scrV addSubview:imageView];
// 释放
[imageView release];
}
// 设置滚动视图的内容大小 (滚动范围)
// 当滚动范围小于等于屏幕大小的时候,不能滚动。
self.scrV.contentSize = CGSizeMake(6 *ScreenWidth,ScreenHeight);
// 设置整页翻动
self.scrV.pagingEnabled = YES;
// 是否显示水平滚动条
self.scrV.showsHorizontalScrollIndicator =NO;
// // 是否显示垂直滚动条
// self.scrV.showsVerticalScrollIndicator = NO;
// 边缘反弹(默认为YES)
self.scrV.bounces = NO;
// //点击状态栏跳到最上面(点击屏幕最上面,图片直接出现,内容的Height要大于屏幕高度)
// self.scrV.scrollsToTop = NO;
// 设置偏移量(默认偏移量是原点(0,0)),显示 1.png
self.scrV.contentOffset =CGPointMake(ScreenWidth, 0);
//将滚动视图添加到视图上。
[self.view addSubview:self.scrV];
// 设置滚动视图的代理
self.scrV.delegate = self;
[self.scrV release];
// UIPageControl
// 创建UIPageControl
UIPageControl *pageC = [[UIPageControlalloc]initWithFrame:CGRectMake(50, 500, 250, 30)];
//将pageC 赋值给self.page
self.page = pageC;
// 设置背景颜色
// pageC.backgroundColor = [UIColor redColor];
//设置页数
pageC.numberOfPages = 4;
//设置当前点颜色
pageC.currentPageIndicatorTintColor =[UIColor whiteColor];
// 设置其它点的颜色
pageC.pageIndicatorTintColor = [UIColorblackColor];
// 设置当前页数
pageC.currentPage = 0;
// 添加方法
[pageC addTarget:self action:@selector(swip:)forControlEvents:UIControlEventValueChanged];
// 添加到视图上
[self.view addSubview:pageC];
[pageC release];
UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];
but.frame = CGRectMake(0, 0, 50, 50);
but.backgroundColor = [UIColor redColor];
[but addTarget:self action:@selector(tap)forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:but];
// 实现轮播图,肉眼看到四张图片,实际上,scrollView中存放了六张图片,需要添加两张辅助图片,用来显示第一张图片和最后一张图片。(scrollView的第一张图片与第五张图片一样,第二张图片与第六张图片一样)
// 辅助视图,用来显示第一张图片(肉眼看到的是第一张图片,实际上是放在scrollView中的最后一个位置)
UIImage *image = [UIImage imageNamed:@"1.png"];
UIImageView *imageV = [[UIImageView alloc]initWithFrame:CGRectMake(5 *ScreenWidth, 0, ScreenWidth, ScreenHeight)];
imageV.image = image;
[self.scrV addSubview:imageV];
//辅助视图,用来显示最后一张图片(肉眼看到的是最后一张图片,实际上是放在scrollView的第一个位置)
UIImage *image1 = [UIImage imageNamed:@"4.png"];
UIImageView *imageV1 = [[UIImageView alloc]initWithFrame:CGRectMake(0,0, ScreenWidth, ScreenHeight)];
imageV1.image = image1;
[self.scrV addSubview:imageV1];
}
- (void)swip:(UIPageControl *)page{
NSLog(@"%ld",page.currentPage);
self.scrV.contentOffset =CGPointMake(page.currentPage * ScreenWidth, 0);
}
- (void)tap{
SecondViewController *sec = [[SecondViewController alloc]init];
[self presentViewController:sec animated:YES completion:^{
}];
}
//偏移量改变的时候执行
- (void)scrollViewDidScroll:(UIScrollView*)scrollView{
//NSLog(@"偏移量改变");
}
// 手指点击开始拖拽时执行一次。
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"开始拖拽");
}
// 手指不拖拽时执行一次
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate{
NSLog(@"结束拖拽");
}
//开始减速时
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"即将减速");
}
//图片移动停止时执行
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"结束减速");
//将PageC和滚动视图联系起来
//轮播图的实现
// 即翻到 scrollView中的最后一张视图时,跳转到肉眼看到的第一张图
if (scrollView.contentOffset.x /ScreenWidth == 5) {
self.page.currentPage = 0;
self.scrV.contentOffset =CGPointMake(ScreenWidth, 0);
// 即翻到 scrollView中的第一张视图时,跳转到肉眼看到的最后一张图
}else if(scrollView.contentOffset.x /ScreenWidth == 0){
self.page.currentPage = 3;
self.scrV.contentOffset = CGPointMake(4 *ScreenWidth, 0);
}else{
self.page.currentPage =scrollView.contentOffset.x / ScreenWidth - 1;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// SecondViewController.m
#import "SecondViewController.h"
#define ScreenWidthself.view.bounds.size.width
#define ScreenHeightself.view.bounds.size.height
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 创建一张图片
UIImage *image = [UIImage imageNamed:@"1.png"];
// 创建图片视图
UIImageView *imageV = [[UIImageView alloc]initWithFrame:[UIScreenmainScreen].bounds];
// 设置图片视图
imageV.image = image;
// 设置滚动视图
UIScrollView *scrV = [[UIScrollView alloc]initWithFrame:[UIScreenmainScreen].bounds];
// 设置滚动视图最小以及最大的缩放比例
scrV.maximumZoomScale = 2;
scrV.minimumZoomScale = 0.5;
//添加图片视图
[scrV addSubview:imageV];
// 添加滚动视图
[self.view addSubview:scrV];
scrV.delegate = self;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 协议的方法
// 缩放比例变化就会使用此方法
- (void)scrollViewDidZoom:(UIScrollView*)scrollView{
NSLog(@"正在缩放");
UIImageView *imageV = [scrollView subviews][0];
if (scrollView.zoomScale < 1) {
imageV.center = CGPointMake(207, 368);
}
}
//确定哪个视图被缩放
- (nullable UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView{
UIImageView *imageV = [scrollView subviews][0];
// if (scrollView.zoomScale < 1) {
// imageV.center = CGPointMake(207, 368);
// }
return imageV;
}
//已经完成缩放
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullableUIView *)view atScale:(CGFloat)scale{
// scrollView.zoomScale = scale;
}
@end