//
// ViewController.m
// UIScrollView
//
// Created by HarrySun on 16/7/12.
// Copyright © 2016年 Mobby. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIPageControl *pageControl;
@end
#define kWidth self.view.bounds.size.width
#define kHeight self.view.bounds.size.height
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//准备图片
NSMutableArray *imagesArray = [[NSMutableArray alloc]initWithCapacity:5];
for(int i = 1;i<=3;i++){
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",i]];
[imagesArray addObject:image];
}
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight )];
[self.view addSubview:self.scrollView];
self.scrollView.contentOffset = CGPointMake(0, 0); // 默认显示x=0,y=0的地方
self.scrollView.contentSize = CGSizeMake( 3 * kWidth, kHeight ); // contentSize决定了视图是否能够滚动
self.scrollView.pagingEnabled = YES; // 是否整页翻动
self.scrollView.bounces = YES; // 边界是否回弹
self.scrollView.scrollsToTop = YES; // 点击上方状态栏是否回到顶部
self.scrollView.scrollEnabled = YES; // 是否能够滚动
self.scrollView.showsHorizontalScrollIndicator = YES; // 是否显示水平方向的滚动条
self.scrollView.showsVerticalScrollIndicator = NO; // 是否显示竖直方向滚动条
self.scrollView.alwaysBounceVertical = YES; // 竖直方向遇到边框是否反弹
self.scrollView.alwaysBounceHorizontal = YES; //水平方向遇到边框是否反弹
self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; // 滚动条的样式,基本只是设置颜色,总共3个颜色:默认、黑、白
self.scrollView.contentInset = UIEdgeInsetsMake(0, 50, 50, 0); // 设置而内容的边缘
self.scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(50, 0, 0, 0); // 设置滚动条的边缘
self.scrollView.directionalLockEnabled = YES; // 是否同时运动,lock
[self.scrollView flashScrollIndicators]; // 短时间内显示滚动条
self.scrollView.delegate = self;
self.scrollView.minimumZoomScale = 0.5; // 缩小的最小比例
self.scrollView.maximumZoomScale = 2; // 放大的最大比例
self.scrollView.bouncesZoom = NO; // 控制缩放的时候是否会反弹
//将图片视图添加到scrollView上
for (int i =0; i<imagesArray.count; i++) {
UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(kWidth * i, 0, kWidth, kHeight)];
imgView.image = imagesArray[i];
[self.scrollView addSubview:imgView];
}
_pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 0, 100, 30)]; // 修改大小只是背景大小就改了,原点的大小不变
self.pageControl.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height - 70);
self.pageControl.backgroundColor = [UIColor redColor];
self.pageControl.numberOfPages = imagesArray.count; // 设置圆点个数
self.pageControl.currentPage = 0; // 设置默认选中的圆点
self.pageControl.hidesForSinglePage = YES; // 当只剩下一个圆点的时候,设置是否隐藏
self.pageControl.defersCurrentPageDisplay = NO; // 设置是否延迟自动更新控制器的当前页码
self.pageControl.pageIndicatorTintColor = [UIColor greenColor]; // 设置未选中的圆点颜色
self.pageControl.currentPageIndicatorTintColor = [UIColor blueColor]; // 设置选中的圆点颜色
// 添加事件
[self.pageControl addTarget:self action:@selector(changePage:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:self.pageControl];
}
#pragma mark - delegate
// 返回一个放大或者缩小的试图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
if (self.scrollView.contentOffset.x == 0) {
return [self.scrollView.subviews firstObject];
}else if (self.scrollView.contentOffset.x == kWidth){
return [self.scrollView.subviews objectAtIndex:1];
}else{
return [self.scrollView.subviews lastObject];
}
}
// 开始放大或者缩小
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
NSLog(@"开始放大或者缩小");
}
// 缩放结束时
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{
NSLog(@"缩放结束时");
}
// 视图已经放大或缩小
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
NSLog(@"正在缩放或放大?:%d",self.scrollView.zooming); // 当正在缩放或放大的时候,返回YES
NSLog(@"当缩小到最小或放到到最大?:%d",self.scrollView.zoomBouncing); // 放缩放到最小或放大到最大返回YES
// 如果操作是缩小操作(即zoomScale < 1),那么让视图固定在中心位置
if (scrollView.zoomScale < 1) {
// 缩放当前视图
UIImageView *imageView = (UIImageView *)[scrollView.subviews firstObject];
// 固定中心位置
imageView.center = CGPointMake(scrollView.bounds.size.width / 2, scrollView.bounds.size.height / 2);
}else{
// 下方是补齐左上方的空隙
// 当视图放大时,保证左上角不出现偏移
UIImageView *imageView = (UIImageView *)[scrollView.subviews objectAtIndex:0];
CGRect rect = CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height);
imageView.frame = rect;
}
NSLog(@"视图已经放大或缩小");
}
// 是否支持滑动至顶部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
return YES;
}
// 滑动到顶部时调用该方法
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
NSLog(@"滑动到顶部时调用该方法");
}
// scrollView 已经滑动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"正在拖动?:%d",self.scrollView.dragging); // 如果scrollView正在被拖动,返回YES
NSLog(@"scrollView 已经滑动");
}
// scrollView 开始拖动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"scrollView 开始拖动");
}
// scrollView 结束拖动
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
NSLog(@"scrollView 结束拖动");
}
// scrollView 开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"scrollView 开始减速");
}
// scrollView 减速停止
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"正在减速?:%d",self.scrollView.decelerating); // 检测scrollView是否是正在减速
//获取偏移量
CGFloat x = self.scrollView.contentOffset.x;
//根据偏移量控制pageControl的当前页
self.pageControl.currentPage = x / kWidth;
NSLog(@"scrollView 减速停止");
}
#pragma mark ------------------pageControl Action---------------
-(void)changePage:(UIPageControl *)pageControl{
//根据pageControl的当前页来设定scrollView的偏移量
CGPoint point = CGPointMake(pageControl.currentPage * kWidth, 0);
//让scrollView根据pageControl的当前页来计算出来的偏移量进行偏移
[self.scrollView setContentOffset:point animated:YES]; // 以恒定速度的动画到新的偏移量
// NSLog(@"%lu",pageControl.currentPage);
[self.pageControl updateCurrentPageDisplay]; // 更新控制器当前页码
CGSize size = [self.pageControl sizeForNumberOfPages:2]; // 通过页数得到控制器大小
NSLog(@"%f,%f",size.width,size.height);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end