有关iOS中UIScrollView的小故事

UIScrollView是UIKit中一个古老且用途广泛的类,自iOS成为iPhone OS 2.0以来一直存在。 它提供了灵活性,可以呈现不适合设备屏幕的大内容。 iOS中最受欢迎的UIComponent(UITextView,UITableView和UICollectionView)是从UIScrollView类继承的。

→UIScrollView具有3个主要属性,分别为contentSizecontentOffsetcontentInset

→内容大小:

ScrollViews只需少量的设置和代码即可为开发人员提供强大的功能。 所有繁重的工作都由Apple处理,我们(Devs)得到了一个众所周知的委托(UIScrollViewDelegate)来管理其状态和功能。 ScrollView只是一个UIView对象,它具有动态原点并在其中移动内容。 它具有一个名为CGSize类型的重要属性contentSize 它表示可滚动区域的大小。 滚动视图必须知道内容视图大小 ,以便知道何时停止滚动。 其默认值为零,即使content-size小于滚动视图自身的大小 ,也必须将其设置为使用任何滚动视图。

在上图中,滚动视图的实际帧由黑色粗线表示,内容大小为男孩图像的大小。

→内容偏移量:

当用户滚动滚动视图时,用户可见的内容区域会更改。 内容视图在滚动视图中的位置称为内容偏移 ,并由contentOffset属性( CGPoint值)表示。 此属性由x和y值从可见区域的 原点 (左上角)到内容视图的 原点 (请看下图)之间的距离定义。 内容大小保持不变,但是内容偏移会更改以响应用户交互。

内容偏移量可以通过编程更改。 contentOffset属性是可读写的。 更有趣的是,您可以使用func setContentOffset(CGPoint, animated: Bool) animation func setContentOffset(CGPoint, animated: Bool)方法来设置内容偏移量的动画。 这将“移动”滚动视图,就像用户自己移动滚动视图一样。

→内容插入:

这是一个UIEdgeInset值,它代表滚动视图的内容应“填充”的区域。 将contentInset属性设置为UIEdgeInsetsMake(10,10,10,10)将在滚动视图的内容周围创建10点的空白。 边缘插入值也可以为负; 这将代表用户无法看到的滚动视图内容周围的区域(除非用户滚动到滚动视图的边缘之外)。

→UIScrollViewDelegate中有3组方法,它们分别响应拖动和滚动缩放滚动动画

  1. 滚动和拖动:

func scrollViewDidScroll(UIScrollView)

告诉委托人用户何时在接收器中滚动内容视图。 每当滚动视图的内容偏移以编程方式或响应用户交互而更改时,调用。 可能的用法可能是在自定义的“套用刷新”控件中。

func scrollViewWillBeginDragging(UIScrollView)

每当将要由用户拖动scrollView时调用。 可能的用途是禁用对scrollView的更新,这可能会中断滚动的平滑性。

func scrollViewWillEndDragging(UIScrollView, withVelocity: CGPoint, targetContentOffset: UnsafeMutablePointer)

拖动后,只要用户从滚动视图中抬起手指,就会调用。 第二个参数以点/秒为单位指定滚动视图在用户抬起手指时的速度。 第三个参数是指向CGPoint的指针,它表示滚动视图将滚动到的位置。 在该指针上修改CGPoint会更改滚动视图滚动到的位置。 可能的用途是计算滚动动画结束时显示哪些内容,并从应用程序编程接口(API)预取该内容。

func scrollViewDidEndDragging(UIScrollView, willDecelerate: Bool)

拖动后,只要用户从滚动视图中抬起手指,就会调用。 第二个参数指定滚动视图是否将其减速效果设置为动画以停止,或者在用户抬起手指时该滚动视图是否已停止。 可能的用法包括重新启动在scrollViewWillBeginDragging:中暂停的所有暂停的计算,只要第二个参数为NO。

func scrollViewShouldScrollToTop(UIScrollView) -> Bool

询问委托人滚动视图是否应滚动到内容的顶部。

func scrollViewDidScrollToTop(UIScrollView)

告诉委托人滚动视图已滚动到内容的顶部。

func scrollViewWillBeginDecelerating(UIScrollView)

告诉与会代表滚动视图开始使滚动运动减速。 每当滚动视图将要开始减速的动画时调用。

func scrollViewDidEndDecelerating(UIScrollView)

告诉代表滚动视图已结束,从而降低了滚动运动。 滚动视图的减速动画完成后调用。 可能的用途包括重新启动在scrollViewWillBeginDragging中暂停的所有暂停的计算:

2. 缩放:

func viewForZooming(in: UIScrollView) -> UIView?

当滚动视图中即将发生缩放时,要求委托人缩放视图。

func scrollViewWillBeginZooming(UIScrollView, with: UIView?)

告诉代表该滚动视图中内容的缩放即将开始。

func scrollViewDidEndZooming(UIScrollView, with: UIView?, atScale: CGFloat)

在滚动视图中的内容缩放完成时通知委托。

func scrollViewDidZoom(UIScrollView)

告诉代表该滚动视图的缩放系数已更改。

3. 滚动动画:

func scrollViewDidEndScrollingAnimation(UIScrollView)

在滚动视图中的滚动动画结束时告诉委托人。

响应插页更改:

func scrollViewDidChangeAdjustedContentInset(UIScrollView)

滚动视图的插入值更改时调用。