scrollView中bounds与contentOffset的

2023-03-10  本文已影响0人  iOS打怪升级

scrollView可以滚动,是在直觉上感受到的一种现象。

我们都知道,两个物体之间的运动,本质上是个相对运动。比如我们乘坐高铁A,A车还没有开时,通过窗外发现另外一个列车B正在向前运动。我座位上的窗户,就是frame.运动的列车,就是content区域。

显然,如果以B车上乘客的视角,A车是在向后方运动。

所以,谈到bounds,contentOffset时,必须要结合frame,contentView以及相对运动的概念才更易于理解。

从直觉上看,当scrollView进行滚动时,frame是不动的,contentView在滚动。这也是contentOffset这个名字本身希望表达的观念,它希望事件的命名和直觉一致便于使用。

"Offset"本意是偏离,移动的意思,听起来contentOffset就在描述content通过不断的Offset和移动,因此呈现出来,就是用户通过frame这个窗口,看到了content就在移动。好像用户站在临街的屋子里,通过窗户观看外面的车水马龙。

然而,从ContentOffset的取值来看,又能看到frame在移动的特征。这是有意思的话题。

contentOffset.(x,y)==bounds.(x,y)

当contentOffset.x在变化时,bounds.x相应在变化。

比如:

contentOffset.x=0 ---------->contentOffset.x=200

表示:

bounds.x = 0---------------->bounds.x=200

我们知道,bounds.x这个值,表达了frame的左上角在bounds这个世界里面的横坐标的偏离值。所以,以上变化也就代表了:

在bounds的坐标系中,也就是假设bounds不动,即contentView不动:

frame.x=0----------------->frame.x=200

不难理解,在用farme表达的坐标方向规则下,frame.x越大,frame表达的矩形就越向右。

frame.y值越大,frame表达的矩形就越向下。

可以想象一下,在contentView的巨大地图上,用户拿着一个放大镜在四处走动。放大镜就是这个frame.

所以,contentOffset这个词,在命名和取值这两个行为有点背离,思维模式必须快速切换才能跟上其节奏。

但是这个命名又是更合适的,因为当操作滚动时,frame不动已经是个先天的假设前提。在这个背景下,实际滚动的对象看上去就是content,因此将content和Offset组合到一起就顺理成章了。

归纳有以下几点:

1,scrollView的滚动本质上是相对运动

2,当frame固定时,编写代码这个操作行为,是把content当作在运动,也就是bounds这个世界在运动。

3, 在表达bounds世界的运动时,为了在概念空间中用frame世界的理论来认知bounds世界的变化,打通两个世界的联系,bounds的取值反应了frame世界与bounds世界之间的距离,以及偏离方向。

4,bounds的取值思路,使我们可以用一个理论来解释两个相对运动中的坐标世界。

上一篇下一篇

猜你喜欢

热点阅读