ScrollView

它的作用可以理解为,看图片,可以用于轮播图,第一次加载的引导页面,照片展示等。

1
2
let scrollView = UIScrollView()
scrollView.frame = CGRect(x: 0, y: 100, width: 100, height: 100)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//        内容物的尺寸
scrollView.contentSize = imageView.bounds.size
// 内容物拉到边时还可以走的距离
scrollView.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 100, right: 10)
scrollView.addSubview(imageView)
scrollView.backgroundColor = .gray
view.addSubview(scrollView)
// 滑动条样式:白、黑、灰
scrollView.indicatorStyle = .white
// 设置缩放
scrollView.delegate = self
scrollView.minimumZoomScale = 0.5
scrollView.maximumZoomScale = 2.0
scrollView.zoomScale = 0.5
// 是否斜滚
scrollView.isDirectionalLockEnabled = true
// 弹性
scrollView.bounces = true
scrollView.alwaysBounceVertical = true
scrollView.alwaysBounceHorizontal = true
// 分页
scrollView.isPagingEnabled = true
// 减速率
scrollView.decelerationRate

缩放需要搭配 zooming 方法

1
2
3
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.imageView
}

委托代理方法(delegate)

要为UIScrollView设置代理

使含有UIScrollView 的 ViewController 遵循 UIScrollViewDelegate 协议,这里用到了扩展

1
2
extension ViewController: UIScrollViewDelegate {
}

delegate函数

①scrollViewDidScroll: 滚动时不停的回掉

精度很高 有一个重要的使用场景:打印滚动时坐标的偏移量

1
2
3
4
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var x = scrollView.contentOffset.x
print("x = \(x)")
}

②scrollViewWillBeginDragging:当用户首次拖动时调用

1
2
3
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
<#code#>
}

③ scrollViewWillEndDragging: 将要结束拖动时

1
2
3
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
<#code#>
}

④ scrollViewDidEndDragging: 当用户的手指停止拖动,离开屏幕时

1
2
3
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {  // Bool参数指明报告滚动到最后视图前是否要减速
<#code#>
}

⑤ scrollViewDidZoom:缩放过程中持续触发

1
2
3
func scrollViewDidZoom(_ scrollView: UIScrollView) {
<#code#>
}

其余列在代码框里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//6.将要开始减速的时候触发
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
print("将要开始减速")
}

//7.已经结束减速完成的时候触发,速度为0,往往都是在这个方法中获取scrollView的contentOffset(很重要)
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
print("减速完成")
}

//8.给scrollView设置一个结束动画的时候触发,不指定动画不会触发
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

}

//9.返回scrollView上缩放的视图
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return scrollView.viewWithTag(200)
}

//10.将要开始缩放的时候触发
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
print("将要开始缩放")
}

//11.结束缩放的时候触发
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
print("结束缩放")
}

//12.设置点击状态栏的时候是否回到顶部
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
return true
}

//13.scrollView已经回到顶部的时候触发的方法
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
print("scrollView已经回到顶部")
}

我们也可以为 ScrollView 中添加控件如 UIButton 会遇到一些响应问题,参考文章