Appcelerator titanium, как мне создать модальное окно?

Я новичок в appcelerator Titanium и у меня есть вопрос

Как я могу создать модальное окно, которое размывает его родителя, или имеет полупрозрачный фон? Мне удалось создать модальное окно, но родительский стал черным.

заранее спасибо

8 ответов

Это текущий способ сделать это в Titanium с 3.1.3 на iOS.

Сначала создайте новое окно.

var myModal = Ti.UI.createWindow({
    title           : 'My Modal',
    backgroundColor : 'transparent'
});

Затем создайте вид оболочки, фоновый вид и вид контейнера:

var wrapperView    = Ti.UI.createView(); // Full screen
var backgroundView = Ti.UI.createView({  // Also full screen
    backgroundColor : '#000',
    opacity         : 0.5
});
var containerView  = Ti.UI.createView({  // Set height appropriately
    height          : 300,
    backgroundColor : '#FFF'
});
var someLabel      = Ti.UI.createLabel({
    title : 'Here is your modal',
    top   : 40
});
var closeButton    = Ti.UI.createButton({
    title  : 'Close',
    bottom : 40
});
closeButton.addEventListener('click', function () {
    myModal.close();
});

Теперь создайте свой стек пользовательского интерфейса. Порядок важен, чтобы избежать необходимости устанавливать z-index.

containerView.add(someLabel);
containerView.add(closeButton);

wrapperView.add(backgroundView);
wrapperView.add(containerView);

myModal.add(wrapperView);

Теперь вы можете открыть свой модальный, но НЕ установить modal : true

myModal.open({
    animate : true
});

Это очень просто. Просто создайте окно, и когда вы открываете его, задайте для свойства 'modal' значение true!

var ModalWindow = Ti.UI.createWindow({});
ModalWindow.open({modal:true}); 

В Titanium Appcelerator (пробовал в 1.6.2) модальное окно всегда полноэкранное. Родитель может показаться черным, потому что фон этого модального окна черный.

Попробуйте указать полупрозрачное изображение в качестве фона этого модального окна, которое вы создаете, и вы можете получить желаемый эффект от него.

Вы можете попробовать использовать opacity на окне у вас есть то, что накладывается на другой.

Ti.UI.currentWindow.opacity = 0.4;

Почему бы просто не дать ему прозрачный фон?

<Window backgroundColor="#80000000">
    <View class="container">
    // Your views
    </View>
</Window>

Мне нравится решение, представленное AlienWebguy, хотя я думаю, что есть небольшая ошибка. Когда вы создаете свой лейбл, я думаю, что вы хотели установить text собственность, а не title имущество:

var someLabel = Ti.UI.createLabel({
    text: 'Here is your modal',
    /* etc., etc. */
});

Когда я использовал title, он (метка) не появлялся в окне.

Еще одна модификация, которую я могу сделать, - установить свойство макета для представления контейнера, например,

var containerView = Ti.UI.createView({
    height: 100, /* or whatever is appropriate */
    backgroundColor : '#FFF',
    layout: 'vertical'
});

При этом вы можете "складывать" элементы графического интерфейса в этом представлении и не беспокоиться (слишком много) о настройке координат компоновки... По крайней мере, это то, что я делаю при создании настраиваемого окна предупреждения с использованием описанных здесь приемов.

Я также искал такое окно с полупрозрачным фоном для IOS 8.4. Я попробовал способ "AlienWebguy" в Alloy XMl, но проблема заключалась в том, что все окно получало непрозрачность 0,5, и содержимое окна в фоновом режиме было отчетливо видно, чем содержимое вида переднего плана. я сделал некоторые изменения в "AlienWebguy", чтобы получить требуемый результат:

<Alloy>
     <Window backgroundColor="transparent" modal="false">
          <View layout="vertical" width="Ti.UI.FILL" height="Ti.UI.FILL" backgroundColor="#000" opacity="0.5">
                   // View will fill whole window with transparent shade of black color.
          </View>

          <View class="container" zIndex="100" height="400" width="Ti.UI.FILL" backgroundColor="#fff"> 
                  // You can add any content here, which will be look like Modal window.
                  //View automatically vertically centered on screen.
          </View>
     </Window>
</Alloy>

Надеюсь, что это сэкономит время разработчиков в Alloy. Спасибо за "AlienWebguy" за концепцию.

Если вы на iPhone, возможно, вы не можете сделать это. на iPhone, если появится модальное диалоговое окно, другое окно в стеке рендеринга будет очищено. То есть только ОДИН модальный диалог в стеке рендеринга. Вот почему вы получили черный цвет, если другие области родителя не закрыты вашим модальным окном. В iPad реализован модальный диалог в стиле "лист", поэтому вы можете сделать области полупрозрачными.

Другие вопросы по тегам