我正在构建一个使用<s:Scroller>组件垂直滚动溢出内容的Flex 4应用程序。让我先解释一下,然后再问我的问题:

  • 页面的主体是从数据库
  • 加载的
  • 加载信息后,将构建应用程序的“主体”(在本例中为您在下面看到的项目列表)
  • 构建列表后,将使用TweenMax将整个封装组件转换为 View ,如下所示:
    myComponent.visible = true;
    
    TweenMax.to(myComponent, 1, {
      alpha : 1,
      y -= 20 //Slides the component up 20px from its original location
    });
    

  • 结果如下。请注意,滚动条是如何一直向下滚动的,但是您可以在底部看到一些截断的白色字母的提示。

    使用我的自定义菜单,我可以离开页面,然后回到页面,Flex会正确地重新计算滚动条的范围,因此我可以向下滚动并查看所有所需的内容。仅当用户输入的初始 URL是这样的较长页面时,才会发生此问题。

    关于如何强制Flex重新计算滚动条范围的任何想法?

    感谢您的时间。

    最佳答案

    好吧,经过大量的研究,拼凑和反复试验,这是我想出的。

    我在做什么错:

    当我第一次发布此问题时,我提到的“组件”已经作为<s:Scroller>的子元素添加了,但是却折叠起来并隐藏起来,如下所示:

    <comp:MyComp alpha="0" height="0" visible="false"/>
    

    当数据被加载并且组件的视觉外观将被恢复并过渡到适当位置时,如下所示:
    myComp.visible = true;
    myComp.height = NaN;
    myComp.invalidateSize();
    myComp.height = myComp.measuredHeight;
    
    TweenMax.to(myComp, 1, {
      alpha : 1,
      y -= 20 //Slides the component up 20px from its original location
    });
    

    这种方法直到稍后才强制<s:Scroller>重新计算其正确大小,有时直到使用相同的方法将myComp移开并且将另一个组件移入位置后才重新计算。即使这样,滚动条的大小也将适合上一个组件的大小,而不适合当前正在显示的组件的大小。

    现在,我正在正确执行操作:

    我的研究表明,无论何时在addElement()本身内部或其任何子级中调用<s:Scroller>方法,都将调用滚动条的measure()方法,并适当调整滚动条的大小。

    我没有将组件放置在滚动器内部并简单地隐藏它们直到需要它们时,而是在ActionScript中动态创建了它们,设置了它们的属性,并分别根据需要使用addElement()removeElement()方法添加和删除了它们。现在,随着旧元素的迁移和新元素的替换,滚动条会正确调整自身大小。

    我面临着最后一个问题。如果用户正在查看的第一页(即,没有先前的组件被转移并销毁)需要滚动条,则该滚动条不会显示。

    我通过添加事件侦听器纠正了最后一个问题,该事件侦听器在新组件完成转换到位时侦听。在事件处理程序内部,我使用以下代码显式设置组件的高度:
    newComp.height = NaN;
    newComp.invalidateSize();
    newComp.height = newComp.measuredHeight;
    

    现在该组件具有明确的高度,即使它是第一页,现在也会出现滚动条。

    现在,滚动条在所有情况下都可以正常工作,并且不会剪切任何内容,或者在不应该滚动时不会消失。

    我希望这对某人有帮助。

    08-24 12:47