Using Transitions

This guide will walk you through the steps needed to create an app that moves from one view to another using a transition.

Requirements

To use this guide you must download and extract the Moobile Boiler Plate.

Note

If you are using Google Chrome, make sure you start it using the --allow-file-access-from-files command line option as explained here or it might not work properly.

Introduction

Transitioning between one view to another requires the Moobile.ViewControllerStack object. This object manages an array of view controllers that were pushed into the view controller stack. The view controller stack uses a transition when pushing a view controller and uses the same transition (but on reverse) when the view controller is popped.

Creating the view controllers

We will need to create two view controllers. Open www/js/app.js and add the following code:

var ViewControllerOne = new Class({

    Extends: Moobile.ViewController,

    nextButton: null,

    viewDidLoad: function() {
        this.view.addClass('view-one');
        this.nextButton = new Moobile.Button();
        this.nextButton.setLabel('Next view');
        this.nextButton.addEvent('tap', this.bound('onNextButtonTap'));
        this.view.addChildComponent(this.nextButton);
    },

    destroy: function() {
        this.nextButton.removeEvent('tap', this.bound('onNextButtonTap'));
        this.nextButton = null;
        this.parent();
    },

    onNextButtonTap: function() {
        this.getViewControllerStack().pushViewController(new ViewControllerTwo, new Moobile.ViewTransition.Slide);
    }

});

var ViewControllerTwo = new Class({

    Extends: Moobile.ViewController,

    prevButton: null,

    viewDidLoad: function() {
        this.view.addClass('view-two');
        this.prevButton = new Moobile.Button();
        this.prevButton.setLabel('Previous view');
        this.prevButton.addEvent('tap', this.bound('onPrevButtonTap'));
        this.view.addChildComponent(this.prevButton);
    },

    destroy: function() {
        this.prevButton.removeEvent('tap', this.bound('onPrevButtonTap'));
        this.prevButton = null;
        this.parent();
    },

    onPrevButtonTap: function() {
        this.getViewControllerStack().popViewController();
    }
});

Also, open www/css/styles.css and add the following code:

.view.view-one > .view-content,
.view.view-two > .view-content {
    -webkit-box-pack: center;
    padding: 12px;
}

Loading the view controller stack

The next step is to set an instance of a Moobile.ViewControllerStack as the root view controller. Open www/index.html and locate this piece of code:

window.addEvent('ready', function() {
    var rootViewController = new ViewController.Home(); // replace this with your own root view controller
    new Moobile.WindowController().setRootViewController(rootViewController);
});

Replace it with :

window.addEvent('ready', function() {
    var rootViewController = new Moobile.ViewControllerStack();
    new Moobile.WindowController().setRootViewController(rootViewController);
    rootViewController.pushViewController(new ViewControllerOne);
});

This creates a view controller stack and pushes an instance of ViewControllerOne without a transition.

Adding a transition

The next step is to add a tap event on both buttons. This will allow to push the second view controller and return to the first one.

var ViewControllerOne = new Class({

    Extends: Moobile.ViewController,

    nextButton: null,

    viewDidLoad: function() {
        this.view.addClass('view-one');
        this.nextButton = new Moobile.Button();
        this.nextButton.setLabel('Next view');
        this.nextButton.addEvent('tap', this.bound('onNextButtonTap'));
        this.view.addChildComponent(this.nextButton);
    },

    destroy: function() {
        this.nextButton.removeEvent('tap', this.bound('onNextButtonTap'));
        this.nextButton = null;
        this.parent();
    },

    onNextButtonTap: function() {
        this.getViewControllerStack().pushViewController(new ViewControllerTwo, new Moobile.ViewTransition.Slide);
    }

});

var ViewControllerTwo = new Class({

    Extends: Moobile.ViewController,

    prevButton: null,

    viewDidLoad: function() {
        this.view.addClass('view-two');
        this.prevButton = new Moobile.Button();
        this.prevButton.setLabel('Previous view');
        this.prevButton.addEvent('tap', this.bound('onPrevButtonTap'));
        this.view.addChildComponent(this.prevButton);
    },

    destroy: function() {
        this.prevButton.removeEvent('tap', this.bound('onPrevButtonTap'));
        this.prevButton = null;
        this.parent();
    },

    onPrevButtonTap: function() {
        this.getViewControllerStack().popViewController();
    }
});

The onNextButtonTap pushes a new view controller to the stack using a Moobile.ViewTransition.Slide transition. The onPrevButtonTap method removes the current view controller (itself) from the view controller stack using the same transition but on reverse.

Open the simulator located at moobile-simulator/index.html in you web browser and enjoy!

Download the demo