Статьи

Titanium Mobile: создайте скользящее меню для iOS

Из этого туториала вы узнаете, как создать скользящее меню, похожее на то, которое представлено в приложении Facebook с использованием Titanium Mobile.


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

Сначала мы создадим меню:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//// —- Menu window, positioned on the left
var menuWindow = Ti.UI.createWindow({
    top:0,
    left:0,
    width:150
});
menuWindow.open();
 
//// —- Menu Table
// Menu Titles
var menuTitles = [
    {title: ‘Menu 1’},
    {title: ‘Menu 2’},
    {title: ‘Menu 3’},
    {title: ‘Menu 4’},
    {title: ‘Menu 5’},
    {title: ‘Menu 6’}
];
// Tableview
var tableView = Ti.UI.createTableView({
    data:menuTitles
});
menuWindow.add(tableView);

Это очень простая настройка табличного представления, но она подойдет. Так что теперь у вас должно быть что-то вроде следующего:


Теперь нам нужно окно с панелью навигации и кнопкой в ​​ней, которая позволит нам открыть меню с анимацией. Итак, для достижения этого нам на самом деле нужны два окна: одно, содержащее навигационную группу (обязательно для того, чтобы иметь панель навигации), и другое, находящееся в навигационной группе:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//// —- Window with navigationGroup
var navWindow = Ti.UI.createWindow({
    width:320 // Set the width of the sliding window to avoid cut out from animation
});
navWindow.open();
 
// Main window
var win = Ti.UI.createWindow({
    title:’Main Window’,
    backgroundColor:’#28292c’,
    barColor:’#28292c’
});
 
// NavigationGroup
var navGroup = Ti.UI.iPhone.createNavigationGroup({
    window:win
});
navWindow.add(navGroup);
 
// Top left button
var menuButton = Ti.UI.createButton({
    title:’Menu’,
    toggle:false // Custom property for menu toggle
});
 
win.setLeftNavButton(menuButton);

Эй, вы, наверное, заметили это свойство toggle:true в нашей кнопке, верно? Это действительно не существует; это пользовательское свойство, которое я добавил. Вы можете назвать его по своему усмотрению или даже создать для него переменную (например, var toggle = true; ), если это заставляет вас чувствовать себя более комфортно. Тем не менее, я рекомендую вам использовать этот маленький трюк, потому что он очень удобен, когда в вашем приложении много пользовательских свойств.

Вот наше главное окно:


Хорошо, теперь мы собираемся анимировать наше окно, чтобы оно скользило слева направо, когда мы нажимаем кнопку «Меню».

Давайте посмотрим, как это работает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
menuButton.addEventListener(‘click’, function(e){
    // If the menu is opened
    if(e.source.toggle == true){
        navWindow.animate({
            left:0,
            duration:400,
            curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT
        });
        e.source.toggle = false;
    }
    // If the menu isn’t opened
    else{
        navWindow.animate({
            left:150,
            duration:400,
            curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT
        });
        e.source.toggle = true;
    }
});

Вы видите, что когда мы нажимаем кнопку, мы вызываем function(e) , где e — наш объект (кнопка). e.source.toggle , мы проверяем свойство «toggle», описанное выше (вы также можете использовать menuButton.toggle , это то же самое). Если оно false , мы перемещаем наше окно вправо и переключаем свойство в true . Так что, конечно, если это true , окно возвращается в нормальное состояние, а затем наше свойство снова устанавливается в false .

curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT — это просто способ сгладить анимацию.


Да, это выглядит довольно аккуратно, верно? Но это было легко, потому что теперь мы становимся серьезными! Мы будем отслеживать событие касания, чтобы мы могли открыть меню, перемещая главное окно по горизонтали. Но перед этим мы добавим несколько пользовательских свойств:

1
2
3
4
5
6
7
8
// Main window
var win = Ti.UI.createWindow({
    title:’Main Window’,
    backgroundColor:’#28292c’,
    barColor:’#28292c’,
    moving:false, // Custom property for movement
    axis:0 // Custom property for X axis
});

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

Теперь мы собираемся использовать событие touchstart для определения положения нашего пальца, когда он касается экрана:

1
2
3
4
win.addEventListener(‘touchstart’, function(e){
    // Get starting horizontal position
    e.source.axis = parseInt(ex);
});

Здесь мы берем горизонтальную координату ( ex ) нашего события, анализируем его как целое число, а затем сохраняем его в нашей axis пользовательских свойств.

Далее мы собираемся анимировать окно в зависимости от положения нашего пальца:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
win.addEventListener(‘touchmove’, function(e){
    // Subtracting current position to starting horizontal position
    var coordinates = parseInt(e.globalPoint.x) — e.source.axis;
    // Detecting movement after a 20px shift
    if(coordinates > 20 || coordinates < -20){
        e.source.moving = true;
    }
    // Locks the window so it doesn’t move further than allowed
    if(e.source.moving == true && coordinates <= 150 && coordinates >= 0){
        // This will smooth the animation and make it less jumpy
        navWindow.animate({
            left:coordinates,
            duration:20
        });
        // Defining coordinates as the final left position
        navWindow.left = coordinates;
    }
});

Чтобы окно не двигалось каждый раз, когда мы прикасаемся к нему, мы ждем движения на 20 пикселей, прежде чем анимировать. Мы отслеживаем нашу координату касания с помощью e.globalPoint.x и вычитаем ее в нашу начальную точку ( axis ), чтобы мы могли перемещать окно. Также он не может скользить за пределы ширины меню (150 пикселей) или за левую сторону экрана.


Если вы попытаетесь запустить свое приложение, вы увидите, что ваше окно останется там, где вы его оставили. Это не то, что мы хотим. Нам нужно переместить его, когда закончится событие касания, поэтому оно будет открываться / закрываться в зависимости от того, где оно находится:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
win.addEventListener(‘touchend’, function(e){
    // No longer moving the window
    e.source.moving = false;
    if(navWindow.left >= 75 && navWindow.left < 150){
        // Repositioning the window to the right
        navWindow.animate({
            left:150,
            duration:300
        });
        menuButton.toggle = true;
    }else{
        // Repositioning the window to the left
        navWindow.animate({
            left:0,
            duration:300
        });
        menuButton.toggle = false;
    }
});

Когда наш палец больше не касается экрана, touchend событие touchend , поэтому мы можем отрегулировать положение нашего окна.


Были сделаны! Как видите, мы использовали очень простую анимацию и математику, чтобы добиться отличного и профессионального эффекта. Я очень надеюсь, что вам понравился этот урок и выучили несколько новых трюков!