常用属性
1 | @property(nonatomic) CGPoint contentOffset; |
UIScrollView的使用步骤
- 创建UIScrollView
- 给UIScrollView添加子控件
- 要想UIScrollView可以滚动,必须设置UIScrollView的滚动范围
1 | // 设置滚动范围 |
注意点
千万不要使用
subviews
来获取UIScrollview中的子控件。- 因为subviews中包含了UIScrollview中的
滚动条
,而且滚动条的顺序是不确定
的。
- 因为subviews中包含了UIScrollview中的
默认情况下只要UIScrollview可以滚动, 就有弹簧效果
bounces
属性用于设置UIScrollview是否有回弹效果
1 | self.scrollview.bounces = NO; |
注意
:alwaysBounceXXX
属性主要用于设置UIScrollview没有设置contentSize的情况- 如果UIScrollview已经设置了contentSize,那么YES和NO没有区别
- alwaysBounceXXX应用场景: 下拉刷新
1 | self.scrollview.alwaysBounceVertical = YES; |
- 设置滚动条的样式和控制滚动条的显示
1 | // 样式 |
contentOffset
- 只要点击了控制器的view系统就会自动调用下面方法
1 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event |
代理
- UIScrollView停止”拖拽”时调用
注意
:停止拖拽并不代表停止滚动,也就是说UIScrollView滚动是有惯性的\在scrollViewDidEndDragging方法中,是没有办法准确的监听到UIScrollView什么时候停止滚动。decelerate
等于YES代表有惯性, 会继续滚动; 如果等于NO代表没有惯性,会停止滚动。
1 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate |
- UIScrollView停止”减速”时调用
- scrollViewDidEndDecelerating不一定会调用, 只有scrollView有惯性的时候才会调用
1 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView |
UIScrollview缩放
步骤:
- 成为UIScrollview的代理, 通过代理方法告诉UIScrollview要缩放哪一个子控件
- 设置子控件最大和最小的缩放比例
常用方法
viewForZoomingInScrollView
: 返回需要缩放的子控件scrollViewDidZoom
: 只要子控件被缩放了就会调用(调用频率非常高)scrollViewDidEndZooming
: 缩放完毕时掉用
如何保证被缩放的子控件永远居中
- 只要子控件的contentSize小于UIScrollview的宽高时才需要缩放
第一种
1 | // 1.判断contentSize的宽高, 是否小于UIScrollView的frame的size |
第二种
1 | // 1.判断contentSize的宽高, 是否小于UIScrollView的frame的size |
第三种 (对第二种方法进行简化)
1 | CGFloat x = scrollView.contentSize.width < scrollView.bounds.size.width ? (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; |
图片轮播器
- 如何分页 :
pagingEnabled = YES
- 分页的原理: 是根据UIScrollview的宽度或者高度来分页
- UIPageControl
numberOfPages
: 设置总页码currentPage
: 设置当前页码pageIndicatorTintColor
: 设置其它页码的颜色currentPageIndicatorTintColor
: 设置当前页码的颜色
自定义页码
- 利用KVC给UIPageControl设置页码图片(私有属性)
1 | [pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"]; |
- 监听UIPageControl的点击
- 由于UIPageControl继承于UIControl, 所以通过addTargt来监听
1 | [pageControl addTarget:self action:@selector(nextPage) forControlEvents:UIControlEventValueChanged]; |
切换页码
- 滚动完毕之后再切换
1 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate |
- 实时切换 (原理相同 实现方式不同的方法)
- 方式1
1 | // 只要滚动就会调用 |
- 方式2
1 | // 当正在滚动的时候就会调用代理的方法 |
NSTimer的使用
- 作用: 可以让系统每隔一段时间执行指定对象的指定方法
- 注意:
1 | @property (nonatomic, weak) NSTimer *timer; |
1 | // 开启定时器(方式2) |
关闭定时器(销毁)
- 这种的性能不好 每次都要重启
1 | [self.timer invalidate]; |
- 暂停定时器(可以采用这种)
1 | // 设置timer的开始时间为 遥远的未来 4001 |
封装的思想
- 只要发现控制器知道得太多,就要考虑重构代码
- 只要发现一个效果很多地方都需要使用, 就要考虑封装