Если вы проверите код для ViewNavigatorSkin
, вы обнаружите, что он раскладывает два своих элемента (ActionBar
и Group
), используя простую математику.Другими словами, он не использует контейнер макета, в котором настройка top
или y
будет иметь какой-либо эффект.
Вместо этого вам необходимо обработать ViewNavigator
.Сначала определите скин (обратите внимание, как я установил top="75"
в VGroup
:
VNSkin.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<!-- host component -->
<fx:Metadata>
[HostComponent("spark.components.ViewNavigator")]
</fx:Metadata>
<!-- states -->
<s:states>
<s:State name="landscapeAndOverlay" />
<s:State name="portraitAndOverlay" />
<s:State name="landscape" />
<s:State name="portrait" />
<s:State name="disabled" />
<s:State name="normal" />
<s:State name="moved" />
</s:states>
<s:VGroup width="100%" height="100%" top="0" top.moved="75">
<s:ActionBar id="actionBar" width="100%" />
<s:Group id="contentGroup" width="100%" height="100%" />
</s:VGroup>
</s:Skin>
Затем внутри моего основногоприложения, я сделаю скин ViewNavigator для использования этого скина:
MyApp.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.ActionbarMoveHomeView" applicationDPI="160" >
<fx:Style>
@namespace s "library://ns.adobe.com/flex/spark";
s|ViewNavigator {
skinClass: ClassReference("VNSkin")
}
</fx:Style>
</s:ViewNavigatorApplication>
Наконец, на мой взгляд, мне нужно установить состояние и поставитьвозвращается, когда представление активируется и деактивируется:
MyView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:viewActivate>
navigator.skin.currentState = "moved";
</s:viewActivate>
<s:viewDeactivate>
navigator.skin.currentState = "normal";
</s:viewDeactivate>
<s:Label text="test" click="navigator.pushView(SecondPage)" />
</s:View>
Обратите внимание, что этот метод добавляет некоторые накладные расходы, потому что ваша оболочка ViewNavigator
теперь MXMLвместо чистого ActionScript. Вы можете подумать о создании обложки в чистом ActionScript на основе исходного кода ViewNavigatorSkin
, чтобы вы могли разместить ее со смещением ... но если вы не заметили значительного снижения производительности из обложки MXML,Я бы не волновался об этом.
РЕДАКТИРОВАТЬ После того, как я написал свой ответ, я заметил, что вы хотите его только для одного просмотра. Я внес изменение, чтобы добавить состояние в VNSkin
класс, а затем переключите состояния в коде представления (viewActivate
и viewDeactivate
. Дляecord, все это похоже на взломать.Я бы рассмотрел какой-то механизм уведомлений, чтобы вы могли общаться со скином, чтобы изменить его каким-либо иным способом ... но я, по крайней мере, помог вам сделать это с помощью одной техники.Я хотел бы, чтобы кто-то пришел сюда и предложил что-то лучшее.До этого у вас есть кое-что, что работает: P