Никакого опыта работы с Flex IFrame здесь только для справки, но в общих чертах вы можете сделать недействительным размер компонента или сделать недействительным список отображения, а затем вызвать validate сейчас, чтобы заставить LayoutManager пересчитать размеры элемента и его дочерних элементов ( или просто нарисуйте в случае аннулирования списка отображения):
Сложная часть, которую я вижу здесь, это выяснить, когда именно вы хотите, чтобы это произошло (то есть захват какого-то события с полосы прокрутки). В тестовых целях вы можете просто создать кнопку и в обработчике кликов сделать следующее:
facebookIFrame.invalidateSize();
facebookIFrame.invalidateDisplayList();
facebookIFrame.validateNow();
Если это сработает, вам просто нужно найти соответствующее событие в Scroller или Canvas, которое сообщит вам, когда происходит прокрутка (в худшем случае вы можете захватить указатель мыши, пометить флаг, затем захватить mouseMove и, если флаг установлен, запустить код для аннулирования / повторной проверки). В основном, как работает макет / чертеж, так это то, что UIComponents имеют флаги, которые позволяют ему знать, когда ему нужно пересчитать размер чего-либо или перерисовать его, таким образом, не всегда все перерисовывается только теми компонентами, которые в этом нуждаются. В этом случае кажется, что FacebookIFrame не становится недействительным в какой-то момент, когда он должен. Дайте мне знать, если я могу помочь больше или это не сработает.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
height="100%"
width="100%"
xmlns:code="http://code.google.com/p/flex-iframe/"
mouseDown="application1_mouseDownHandler(event)"
mouseUp="application1_mouseUpHandler(event)"
mouseMove="application1_mouseMoveHandler(event)">
<mx:Script>
<![CDATA[
var isMouseDown:Boolean;
protected function button1_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
facebookIFrame.invalidateSize();
facebookIFrame.invalidateDisplayList();
facebookIFrame.validateNow();
}
protected function application1_mouseDownHandler(event:MouseEvent):void
{
isMouseDown = true;
}
protected function application1_mouseUpHandler(event:MouseEvent):void
{
isMouseDown = false;
}
protected function application1_mouseMoveHandler(event:MouseEvent):void
{
if(isMouseDown)
{
facebookIFrame.invalidateSize();
facebookIFrame.invalidateDisplayList();
facebookIFrame.validateNow();
}
}
]]>
</mx:Script>
<mx:Spacer height="1000"/>
<mx:Button label="Test Invalidation"
click="button1_clickHandler(event)"/>
<mx:HBox visible="true" backgroundColor="#cccccc" id="facebookhbox" width="100%" height="80" horizontalAlign="center" verticalAlign="middle" verticalGap="0" verticalScrollPolicy="off">
<mx:Canvas id="facebookcanvas" visible="true" x="0" y="0" width="650" height="80">
<code:IFrame visible="true" y="0" x="0" id="facebookIFrame" source="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.examplelink.com&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80" width="450" height="80"/>
</mx:Canvas>
</mx:HBox>
</mx:Application>
Обновлено, чтобы включить полное приложение, показывающее работающий пример, это ни в коем случае не хороший способ сделать что-то, это связано с ошибкой в коде IFrame, которая должна быть исправлена (хотя я не уверен, как и где ошибка существует, что-то должно вызывать ее надлежащую аннулирование там, где ее нет).
Shaun