何時間にもわたって調査し、つなぎ合わせ、試行錯誤を繰り返した結果、私は思いついたのです。
私が間違っていたこと:
この質問を最初に投稿したとき、私が言及した「コンポーネント」は、の子要素としてすでに追加されていましたが<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()
メソッドをそれぞれ使用してコンポーネントを追加および削除しました。これで、古い要素が移行され、新しい要素が代わりに使用されるため、スクローラーは自動的にサイズを変更します。
私が直面した最後の問題が1つありました。ユーザーが表示していた最初のページ(つまり、移行されて破棄された以前のコンポーネントがなかった場合)にスクローラーが必要な場合、そのページは表示されませんでした。
新しいコンポーネントの移行が完了したときにリッスンするイベントリスナーを追加することで、この最後の問題を修正しました。イベントハンドラー内で、次のコードを使用してコンポーネントの高さを明示的に設定します。
newComp.height = NaN;
newComp.invalidateSize();
newComp.height = newComp.measuredHeight;
コンポーネントに明示的な高さが設定されたため、最初のページであっても、スクローラーが表示されます。
スクローラーはすべての場合に期待どおりに機能するようになり、コンテンツが途切れたり、表示されるべきでないときに消えたりすることはありません。
お役に立てば幸いです。