美文网首页
scrollView中bounds与contentOffset的

scrollView中bounds与contentOffset的

作者: iOS打怪升级 | 来源:发表于2023-03-10 12:45 被阅读0次

    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的取值思路,使我们可以用一个理论来解释两个相对运动中的坐标世界。

    相关文章

      网友评论

          本文标题:scrollView中bounds与contentOffset的

          本文链接:https://www.haomeiwen.com/subject/qsftrdtx.html