好的,经过数小时的研究、拼凑和反复试验,这就是我想出的。
我做错了什么:
当我第一次发布这个问题时,我提到的“组件”已经被添加为 的子元素<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;
现在组件有了明确的高度,滚动条现在出现了,即使它是第一页。
现在,滚动条在所有情况下都可以按预期工作,并且不会切断任何内容或在不应该的时候消失。
我希望它对某人有帮助。