UIScrollView的基础
UIScrollView是一些UIKit类的父类,如UITableView、UITextView。
UIScrollView可以看作两层-scrollView(滚动视图,用于滚动)和contentView(内容视图,用于展示内容)。
一个UIScrollView对象的核心概念是在内容视图上的原点上是可调整的。
UIScrollView对象以自身尺寸来剪裁内容,但它自身尺寸通常(但不必定)与App的主窗口重合。
ScrollView跟踪手指的移动并且相应的调整原点。
通过ScrollView显示内容的View,根据固定在内容视图中的偏移量的新原点绘制自身的部分(ScrollView自身不参与绘制,除非显示垂直或水平的滑动指示器)
ScrollView必须知道内容的尺寸,以此来判断什么时候停止滚动。
默认情况下,当滚动内容超出范围,它会有反弹效果。
管理ScrollView中绘制内容显示的对象,应平铺内容的子视图,以至于没有View超出屏幕大小。
当用户在滚动视图中滚动时,此对象应根据要求添加或删除子视图。
触摸事件分发原理
因为ScrollView没有ScrollBar,他必须知道一个触摸操作是否代表一个滚动意图还是一个跟踪内容中的子View的意图。
为了判断,它通过启动一个计时器暂时拦截触摸事件,并在计时器触发之前,查看触摸是否有移动。
若计时器在没有位置变化的情况下触发,则ScrollView将跟踪事件传递给内容中的子View。
若用户在计时器停止前将手指拖到了足够远的距离,则ScrollView会取消内容中子View的跟踪事件,并执行滚动操作。
子类可以重写touchesShouldBegin()、isPagingEnabled()和touchesShouldCancel()方法(由scrollView调用),来影响scrollView处理滚动手势的方式。
若你给View的restorationIdentifier属性设置了值,它会尝试在app崩溃时保留滚动相关的信息,特殊的,将保留zoomScale,contentInset和contentOffset属性的值。
在重启时,ScrollView保存的值,使内容显示滚动到以前相同位置。
UIScrollView的主要属性
属性 | 含义 |
---|---|
frame | 滚动视图(可见区域)的大小和位置 |
contentSize | 代表内容视图的大小 |
indicatorStyle | 滑动光标的样式 |
bounces | 滑动到边缘时具有反弹效果 |
isPagingEnabled | 分页效果,每次移动一个格 |
contentOffset | UIScrollView当前显示区域的顶点相对于UIScrollView的frame的坐标。 |
bouncesZoom | 类似于bounces属性,这个属性可以让用户的缩放操作超出最大或最小缩放级别,然后弹回。 |
minimumZoomScale | 最小缩放比例 |
maximumZoomScale | 最大缩放比例 |
showsHorizontalScrollIndicator | 显示水平滚动条 |
showsVerticalScrollIndicator | 显⽰垂直滚动条 |
scrollsToTop | 点击状态栏返回顶部 |
在UIScrollView中添加控件
func configViews() {
let scrollView = UIScrollView.init(frame: CGRect.init(x: 0, y: 0, width: 414, height: 200))
scrollView.contentSize = CGSize.init(width: 414 * 5, height: 200)
scrollView.backgroundColor = .gray
scrollView.indicatorStyle = .white
scrollView.bounces = true
view.addSubview(scrollView)
let label = UILabel.init(frame: CGRect.init(x: 414, y: 0, width: 414, height: 50))
label.textColor = .red
label.text = "hello"
scrollView.addSubview(label)
}
委托代理方法
拓展含有UIScrollView的ViewController继承UIScrollViewDelegate,其中的一些常用的方法
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// 滚动时不停的回调
}
func scrollViewDidZoom(_ scrollView: UIScrollView) {
// 缩放过程中持续触发
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
// 用户首次拖动时调用
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// 将要结束拖动时调用
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
// 用户手指停止拖动,离开屏幕时调用
}
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
// 将要开始减速时调用
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// 减速完成时触发,速度为0,通常在这里获取scrollView的contentOffset
}
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
// 给scrollView设置一个结束动画的时候触发,不指定动画不会触发
}
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
// 将要开始缩放时触发
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
// 结束缩放时触发
}
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
// 设置点击状态栏时是否会到顶部
return true
}
func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
// scrollView已返回顶部时触发
}
}