UIScrollView使用的步骤

  • 1.创建UIScrollView
  • 2.将需要展示的内容添加到UIScrollView中
  • 3.设置UIScrollView的滚动范围 (contentSize)
  • 4.添加两个子控件到UIScrollView中
  • 5.一个控件没有设置frame, 默认x/y就是0
scrollView不能滚动的几种情况
1.没有设置contentSize
 2.scrollEnabled属性 = NO
 3.userInteractionEnabled属性 = NO
enabled和userInteractionEnabled的区别
1. enabled: 代表控件不可用
 2. userInteractionEnabled: 代表控件不可以和用户交互, 也就是不能响应用户的操作
如何去掉滚动条
  1. self.scrollView.showsHorizontalScrollIndicator = NO;
  2. self.scrollView.showsVerticalScrollIndicator = NO;
  3. 滚动条也是scrollView的子控件的一部分
  4. 滚动条可能在子控件的前面, 也可能在子控件的后面
  5. 正是因为这个原因, 所以以后在开发中不推荐大家通过subviews获取子控件的方式来操作子控件

[self.scrollView.subviews lastObject];


设置滚动条的样式

self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;

  1. 默认情况下UIScrollView有一个回弹效果,只要设置了contentSize就有回弹效果

self.scrollView.bounces = YES;

  1. 设置默认是否有回弹效果 (默认就是没有设置contentSize的情况)
    垂直方向可以回弹
  2. 下拉刷新

self.scrollView.alwaysBounceVertical = YES;

  1. 哪怕没有设置contentSize也可以有回弹效果

self.scrollView.alwaysBounceHorizontal = YES;


设置内容偏移位(contentOffset)

  1. 其实就是设置scrollView滚动到什么地方
  2. 告诉scrollView x方向要移动多少, y方向要移动多少
  3. 如果x是正数: 图片往左边移动
  4. 如果x是负数: 图片往右边移动
  5. 同理y是正数: 图片往上移动
  6. 同理y是负数: 图片往下移动
    7. 计算公式: 永远都是以 控件的左上角 – 内容的左上角

sc.contentOffset = CGPointMake(100, 0);

8. 注意点:contentOffset移动的位置是一个临时的位置, 只要轻轻拖拽一下就会回到默认的位置

2.设置滚动范围

self.sc.contentSize = CGSizeMake(IMAGE_COUNT * width, height);

self.sc.contentSize = CGSizeMake(width, IMAGE_COUNT * height);

self.sc.bounces = NO;

self.sc.pagingEnabled = YES;

pagingEnabled实现分页的本质, 是按照UIScrollView的宽度或者高度来分页的
UIScrollView的宽度就是一页的宽度


UIScrollViewDelegate

  • 如何监听一个控件的变化/状态
  • 1.首先需要查看该控件的头文件, 看它继承于谁
  • 1.1如果继承于UIControl, 那么就可以通过addTarget来监听
  • 1.2如果继承于UIView, 那么必须通过代理来监听
  • 代理协议的规律:
  • 以控件的类名开头, 后面加上delegate
  • 代理协议中的方法名的规律:
  • 一般以控件名称去掉类前缀开头
  • 代理协议中的方法参数的规律:
  • 谁触发事件, 就将谁传递进来
  • 如何监听UIScrollView的变化
  • 1.成为UIScrollView的代理
  • 2.遵守UIScrollView的协议

3.实现UIScrollView协议中的方法

代理作用:
  • 当A对象想监听B对象的变化 , 那么可以让A成为B的代理
  • 当B对象发生一些变化想通知A对象, 那么可以让A成为B的代理
    self.sc.delegate = self;
  • 只要成为了UIScrollView的代理, 遵守代理协议, 实现协议中的方法
    当UIScrollView发生一些变化的时候, 系统就会自动调用这些代理方法

- scrollViewDidScroll方法什么时候调用?
- 只要UIScrollView滚动了, 系统就会自动调用

  • - scrollViewWillBeginDragging
  • 只要用户准备开始拖拽了就会调用

- (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

  • 每次调用 停止拖拽方法时 ,系统都会传入一个当前是否有惯性的参数
    我们可以判断该参数是否为YES, 如果是YES代表当前UIScrollView有惯性, 停止拖拽并不会停止滚动, 需要在停止减速方法中监听什么时候真正的停止

UIScrollView已经停止减速了

  • 只有执行了这个方法才代表UIScrollView已经停止滚动了

- (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView

注意:
  • 如果想在UIScrollView停止滚动之后做一些操作, 有两种情况
  • 1.没有惯性的情况: 只会调用 停止拖拽的方法, 不会调用停止减速的方法
  • 2.有惯性的情况: 既会调用 停止拖拽的方法, 也会调用停止减速的方法
  • 所以: 以后要判断UIScrollView是否停止滚动, 需要同时重写两个方法
    scrollViewDidEndDraggingscrollViewDidEndDecelerating

UIScrollView缩放

  • 要想缩放, 除了告诉UISrollView要缩放哪一个控件以外, 还要告诉UISrollView最小能缩多小, 最大能放多大
```self.sc.maximumZoomScale = 2.0;```

   ``` self.sc.minimumZoomScale = 0.5;想要缩放, 必须明确的告诉UISrollView要缩放哪一个控件
  • 要想缩放图片分为两步
  • 1.成为代理, 通过代理方法告诉UIScrollView要缩放哪一个子控件
  • 2.设最大置子控件和最小的缩放比例
  • 想要缩放, 必须明确的告诉UISrollView要缩放哪一个控件
    - 因为UISrollView中可能有多个子控件
  • 那么UISrollView就搞不清楚到底要缩放哪一个子控件
  • 在此方法中告诉UISrollView要缩放哪一个控件

- (nullable UIView *)viewForZoomingInScrollView:(nonnull UIScrollView *)scrollView { return self.iv; }

  • 和scrollViewDidScroll一样, 只要缩放一点点就会调用
    - (void)scrollViewDidZoom:(nonnull UIScrollView *)scrollView { NSLog(@"%s", __func__); }
  • 缩放结束时调用
    - (void)scrollViewDidEndZooming:(nonnull UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale { NSLog(@"%s", __func__); }

#UIScrollView的轮播

self.sc.pagingEnabled = YES;

pagingEnabled实现分页的本质, 是按照UIScrollView的宽度或者高度来分页的
UIScrollView的宽度就是一页的宽度

pageControl

  • 设置未显示的页码颜色 self.pageControl.pageIndicatorTintColor = [UIColor blackColor];
  • 设置当前显示的页码颜色 self.pageControl.currentPageIndicatorTintColor = [UIColor purpleColor];
  • 设置当前页码 self.pageControl.currentPage = currnetPage;
  • 通过KVC给UIPageControl的私有属性赋值, 设置自定义图片
    [self.pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"];[self.pageControl setValue:[UIImage imageNamed:@"other"] forKeyPath:@"_pageImage"];

NSTimer

  • NSTimer应该是weak, 因为只要创建一个NSTimer对象, 该对象就会被主线程强引用
    @property (weak, nonatomic) NSTimer *timer;scheduledTimerWithTimeInterval: 创建一个定时器, 并且立即可是计时
    TimeInterval: 间隔时间
    target: 调用谁的方法
    selector:调用什么方法
    userInfo:需要传递什么参数 repeats: 是否重复
  • 如果给userInfo赋值, 那么定时器调用的方法就必须接受参数, 并且接受的参数就是NSTimer
  • 只要调用scheduled方法创建一个NSTimer对象, 系统就会自动将NSTimer添加到主线程中 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage:) userInfo:@" " repeats:YES];
  • 主线程在处理其它事件的时候, 分一点时间来处理NSTimer

[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];