我正在构建一个使用<s:Scroller>
组件垂直滚动溢出内容的Flex 4应用程序。让我先解释一下,然后再问我的问题:
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;
现在该组件具有明确的高度,即使它是第一页,现在也会出现滚动条。
现在,滚动条在所有情况下都可以正常工作,并且不会剪切任何内容,或者在不应该滚动时不会消失。
我希望这对某人有帮助。