3

我正在构建一个 Flex 4 应用程序,它使用一个<s:Scroller>组件来垂直滚动溢出的内容。在我提出问题之前,让我解释一下会发生什么:

  1. 页面的主体是从数据库加载的
  2. 加载信息后,将构建应用程序的“主体”(在本例中为您在下面看到的项目列表)
  3. 一旦构建了列表,整个封装组件就会使用 TweenMax 转换到视图中,如下所示:

    myComponent.visible = true;
    
    TweenMax.to(myComponent, 1, {
      alpha : 1,
      y -= 20 //Slides the component up 20px from its original location
    });
    

下面是结果。请注意滚动条是如何一直向下滚动的,但是您可以看到在最底部被切断的几个白色字母的提示。

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

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

感谢您的时间。

在此处输入图像描述

4

1 回答 1

1

好的,经过数小时的研究、拼凑和反复试验,这就是我想出的。

我做错了什么:

当我第一次发布这个问题时,我提到的“组件”已经被添加为 的子元素<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;

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

现在,滚动条在所有情况下都可以按预期工作,并且不会切断任何内容或在不应该的时候消失。

我希望它对某人有帮助。

于 2012-08-11T16:02:05.350 回答