NavBar

NavBar running on iPad

NavBar running on iPad

Works With:

apple_logo google_android

Note: While NavBar runs on phones, it works best with table devices.

NavBar

A left-side, icon based, customizable navigation strip and view controller for tablet based iOS and Android


  • Multiple button types
  • Three button regions
  • Automatic subview handling
  • Hide/show NavBar
  • Smooth animations and transitions
  • Supports Android and iOS

$150$50

About NavBar

NavBar is a left-side, icon based, customizable navigation strip and view controller for tablet based iOS and Android devices that supports several different types of user definable buttons such as:

  • View - Handles hiding and showing an attached view
  • AutoDisposingView - Handles hiding and showing an attached view and removes the view from memory when it loses focus
  • Tool - A button that has a user defined action when touched
  • Notification - A non-touchable icon displayed in the bar

NavBar has three separate regions that you can add buttons to: Top, Middle and Bottom. NavBar automatically handles the spacing and placement of buttons within the regions and responds to UIInterfaceOrientation events with smoothly animated transitions.

Note: While Navbar will work on small screen devices such as iPhones, iPod Touches and Android phones, it was designed for tablet devices as may not provide the best User Experience in these situations.

Features

NavBar features a fully documented API with full comments for every element. NavBar is fully customizable with user definable appearances for every element of its UI and its interface is built from vectors to be fully resolution independent.

iOS Example

NavBar was designed to make adding it to an iOS project super easy. Open your .xib file in Xcode, insert a UIView, make it 80 pixels wide and pin it to the left hand side of the screen. Then change its Class to UINavBar, next switch to the Editor view in Xcode and create an outlet for your UINavBar called "navBar".

Switch back to Xamarin Studio and quickly add buttons and views to your NavBar for it to control:

using Appracatappra.ActionComponents.NavBar;
...

public override void ViewDidLoad ()
{
    UIImageView homeView = null;
    UINavBarButton warning = null, delete = null, ticket = null;

    base.ViewDidLoad ();

    //---------------------------------------------
    // NavBar created from a UIView set to UINavBar
    // in Xcode and saved to the .xib file
    //---------------------------------------------
    // Adjust the appearance of the NavBar
    navBar.appearance.border = UIColor.Gray;

    // Create a new view from code
    // Adjust view to match current interface orientation
    switch (UIApplication.SharedApplication.StatusBarOrientation) {
    case UIInterfaceOrientation.LandscapeLeft:
    case UIInterfaceOrientation.LandscapeRight:
        homeView = new UIImageView(new RectangleF(0,0,1024,748));
        homeView.Image=UIImage.FromFile("homeview.png");
        break;
    case UIInterfaceOrientation.Portrait:
    case UIInterfaceOrientation.PortraitUpsideDown:
        homeView = new UIImageView(new RectangleF(0,0,748,1004));
        homeView.Image=UIImage.FromFile("homeview-portrait.png");
        break;
    }

    //---------------------------------------------
    // Add buttons to the top of the bar
    //---------------------------------------------
    // The first button added to the top collection will automatically be selected
    UINavBarButton home = navBar.top.AddButton (UIImage.FromFile ("Icons/house.png"), true, false);

    // Wire up request for this button's view
    home.RequestNewView += responder => {
        // Attaching a view to a button will automatically display it under the NavBar
        home.attachedView = homeView;
    };

    //Add an action to the home button
    home.Touched += responder => {
        // Hide warning notification in NavBar
        if (warning != null) warning.Hidden = true;

        // Disable the delete button
        if (delete != null) delete.Enabled = false;
    };

    // Request that the initial view being controlled by the NavBar be displayed
    navBar.DisplayDefaultView ();

    navBar.top.AddAutoDisposingButton (UIImage.FromFile ("Icons/bar-chart.png"), true, false).RequestNewView += responder => {
        // Build new view from a .xib file and attach it to the button it will automatically
        // be displayed under the NavBar
        responder.attachedView = BarChartView.Factory (this);
    };

    navBar.top.AddButton (UIImage.FromFile ("Icons/orgchart.png"), true, false).RequestNewView += responder => {
        responder.attachedView = OrgChartView.Factory (this);
    };

    ticket = navBar.top.AddButton (UIImage.FromFile ("Icons/ticket.png"), true, false);

    ticket.RequestNewView += responder => {
        responder.attachedView = TicketView.Factory (this);
    };

    ticket.Touched += responder => {
        // Enable the delete button
        if (delete != null) delete.Enabled = true;
    };

    //--------------------------------------------
    // Add buttons to the middle of the bar
    //--------------------------------------------
    navBar.middle.AddTool (UIImage.FromFile ("Icons/printer.png"), true, false).Touched += responder => {
        // Display Alert Dialog Box
        using (var alert = new UIAlertView ("NavBar", "Sorry but printing is not available at this time.", null, "OK", null)) {
            alert.Show ();    
        }

        // Display warning notification in NavBar
        if (warning != null) warning.Hidden = false;
    };

    delete = navBar.middle.AddTool (UIImage.FromFile ("Icons/trash.png"), false, false);
    delete.Touched += responder => {
        // Verify that the user really wants to stop downloading information
        var alert = new UIAlertView ("NavBar", "Delete Item?", null, "Cancel", "OK");
        // Wireup events
        alert.CancelButtonIndex = 0;
        alert.Clicked += (sender, buttonArgs) => {
            // Did the user verify termination?
            if (buttonArgs.ButtonIndex == 1) {
                // Yes
                delete.Enabled = false;
            }
        };

        // Display dialog
        alert.Show ();
    };

    //-----------------------------------------
    // Add buttons to the bottom of the bar
    //-----------------------------------------
    warning = navBar.bottom.AddNotification (UIImage.FromFile ("Icons/warning.png"), null, true);
    navBar.bottom.AddButton (UIImage.FromFile ("Icons/gear.png"), true, false).RequestNewView += responder => {
        responder.attachedView = SettingsView.Factory (this, navBar);
    };
}

NOTE: NavBars and the UIViews that they control can be completely created in C# code without using .xib files.

Android Example

NavBar was designed to make adding it to an Android project super easy. Open your Main.axml file in Xamarin Studio, insert a View, make it 80 pixels wide and pin it to the left hand side of the screen. Then change its Class to UINavBar then edit it's Activity.

...
using Appracatappra.ActionComponents.NavBar;
...

[Activity (Label = "NavBarTestAndroid", MainLauncher = true)]
public class Activity1 : Activity
{
    #region Constantants
    const int DialogLongMessage=1;
    const int DialogLongMessageOkCancel=2;
    #endregion 

    #region Private Variables
    private UINavBar navBar;
    private ImageView viewHome;
    private View viewBarChart, viewOrgChart, viewTicket, viewSettings;
    private Button showHideNavBar = null;
    private UINavBarButton warning = null, delete = null, ticket = null;
    private string dialogMessage="";
    #endregion 

    #region Override Methods
    protected override void OnCreate (Bundle bundle)
    {

        base.OnCreate (bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        // Gain Access to all views and controls in our layout
        navBar = FindViewById<UINavBar> (Resource.Id.navBar);
        viewHome = FindViewById<ImageView> (Resource.Id.viewHome);

        //Are we rehydrating after a state change?
        if (bundle!=null) {
            //Yes, attempt to restore the previously selected NavBar button
            navBar.rehydrationId = bundle.GetInt ("SelectedButton");
            navBar.Hidden = bundle.GetBoolean("Hidden");
        }

        // Style bar
        navBar.appearance.border = Color.LightGray;

        //---------------------------------------------
        // Add buttons to the top of the bar
        //---------------------------------------------
        // The first button added to the top collection will automatically be selected
        UINavBarButton home = navBar.top.AddButton(Resource.Drawable.house,true,false);

        // Wire up request for this button's view
        home.RequestNewView += responder => {
            // Attach view to the button
            responder.attachedView=viewHome;
        };

        // Add an action to the home button
        home.Touched += responder => {
            // Hide warning notification in NavBar
            if (warning != null) warning.Hidden = true;

            // Disable the delete button
            if (delete != null) delete.Enabled = false;
        };

        // Add Bar Chart
        navBar.top.AddAutoDisposingButton (Resource.Drawable.barchart,true,false).RequestNewView += (responder) => {
            // Bring view into existance
            viewBarChart = (View)LayoutInflater.Inflate (Resource.Layout.ViewBarChart,null);

            // Attach view to the button
            responder.attachedView = viewBarChart;
        };

        // Add Org Chart
        navBar.top.AddAutoDisposingButton (Resource.Drawable.orgchart,true,false).RequestNewView += (responder) => {
            // Bring view into existance
            viewOrgChart = (View)LayoutInflater.Inflate (Resource.Layout.ViewOrgChart,null);

            // Attach view to the button
            responder.attachedView=viewOrgChart;
        };

        // Add ticket
        ticket = navBar.top.AddAutoDisposingButton (Resource.Drawable.ticket,true,false);

        ticket.RequestNewView += responder => {
            // Bring view into existance
            viewTicket = (View)LayoutInflater.Inflate (Resource.Layout.ViewTIcket,null);

            // Attach view to the button
            responder.attachedView=viewTicket;
        };

        ticket.Touched += responder => {
            // Enable the delete button
            if (delete != null) delete.Enabled = true;
        };

        //--------------------------------------------
        // Add buttons to the middle of the bar
        //--------------------------------------------
        navBar.middle.AddTool (Resource.Drawable.printer,true,false).Touched+= (responder) => {
            // Inform user (dialogMessage defined as a global variable)
            dialogMessage="Sorry but printing is not supported at this time";
            ShowDialog (DialogLongMessage);

            // Display warning notification in NavBar
            if (warning != null) warning.Hidden = false;
        };

        delete = navBar.middle.AddTool (Resource.Drawable.trash,false,false);

        delete.Touched += (responder) => {
            // Inform user (dialogMessage defined as a global variable)
            dialogMessage="Are you sure you what to delete the item?";
            ShowDialog (DialogLongMessageOkCancel);
        };

        //-----------------------------------------
        // Add buttons to the bottom of the bar
        //-----------------------------------------
        warning = navBar.bottom.AddNotification (Resource.Drawable.warning, null, true);
        navBar.bottom.AddAutoDisposingButton (Resource.Drawable.gear, true, false).RequestNewView += responder => {
            // Bring view into existance
            viewSettings = (View)LayoutInflater.Inflate (Resource.Layout.ViewSettings,null);

            // Attach view to the button
            responder.attachedView=viewSettings;

            // grab show/hide button
            showHideNavBar = FindViewById<Button> (Resource.Id.showHideButton);

            //-----------------------------------------
            // Wireup button action
            //-----------------------------------------
            if (showHideNavBar!=null) {
                showHideNavBar.Click += (sender, e) => {
                    //Is the NavBar visible?
                    navBar.Hidden=(!navBar.Hidden);
                };
            }
        };

    }

    protected override void OnStart ()
    {
        base.OnStart ();

        //-----------------------------------------
        // Ask the Nav Bar to display the first view
        //-----------------------------------------
        navBar.DisplayDefaultView();
    }

    protected override Dialog OnCreateDialog (int id)
    {
        Dialog alert = null;
        AlertDialog.Builder builder;

        base.OnCreateDialog (id);

        // Build requested dialog type
        switch (id){
        case DialogLongMessage:
            builder = new AlertDialog.Builder(this);
            builder.SetIcon (Android.Resource.Attribute.AlertDialogIcon);
            builder.SetTitle ("NavBar");
            builder.SetMessage(dialogMessage);
            builder.SetPositiveButton ("OK", delegate(object sender, DialogClickEventArgs e) {
                // Ignore for now
            });
            alert=builder.Create ();
            break;
        case DialogLongMessageOkCancel:
            builder = new AlertDialog.Builder(this);
            builder.SetIcon (Android.Resource.Attribute.AlertDialogIcon);
            builder.SetTitle ("NavBar");
            builder.SetMessage(dialogMessage);
            builder.SetPositiveButton ("OK", delegate(object sender, DialogClickEventArgs e) {
                // Ignore for now
            });
            builder.SetNegativeButton ("Cancel", delegate(object sender, DialogClickEventArgs e) {
                // Ignore for now
            });
            alert=builder.Create ();
            break;
        }

        // Return dialog
        return alert;
    }

    protected override void OnSaveInstanceState (Bundle outState)
    {
        //Save the NavBar's selected button before the state change
        outState.PutInt("SelectedButton",navBar.SelectedButtonId ());
        outState.PutBoolean("Hidden",navBar.Hidden);

        base.OnSaveInstanceState (outState);
    }
    #endregion
}

Trial Version

The Trial version of NavBar is fully functional however the bar background is watermarked. The fully licensed version removes this watermark.

Some screenshots created with PlaceIt.

NavBar Component

Getting Started with NavBar

To use an NavBar in your mobile application include the ActionPack.iOS or ActionPack.Android component and reference the following using statement in your C# code:

using Appracatappra.ActionComponents.NavBar;

Adding NavBar to your Mobile App

NavBar was designed to make adding it to your mobile application in Xamarin Studio easy.

For iOS

Add a UIView to your project in a .xib file using Xcode then switch it's type to UINavBar. Ensure that you pin the NavBar to the left hand side of the screen and make it's width exactly 80 pixels wide.

Warning! Failing to do either of these will result in a NavBar that will not look or function correctly!

For Android

Open your Main.axml file in Xamarin Studio, insert a RelativeLayout then insert a View into it, make it 80 pixels wide and pin it to the left hand side of the RelativeLayout, make its Height fill the parent and change its Class to Appracatappra.ActionComponents.NavBar.UINavBar in the Source view.

Next add a few sub views and controls to the RelativeLayout under your NavBar, this is done so that the NavBar can "float above and overlap" the sub views that it controls and draw the shadow and NavBarPointer over those views.

Warning!: Your UINavBar MUST be hosted inside of a RelativeLayout or an error will be thrown and you must set your sub views visibility to gone initally for the NavBar to properly control them. The NavBar is itself a type of custom RelativeLayout.

Created from Code

You also have the option of creating your NavBar completely in C# code for either iOS or Android.

Adding View Buttons to your NavBar

Once you have created your NavBar and added it to your view you can add buttons that will link to views that the NavBar will automatically control and bring to the surface when tapped by the end user.

iOS Example:

//---------------------------------------------
// Add buttons to the top of the bar
//---------------------------------------------
// The first button added to the top collection will automatically be selected
UINavBarButton home = navBar.top.AddButton (UIImage.FromFile ("Icons/house.png"), true, false);

// Wire up request for this button's view
home.RequestNewView += responder => {
    // Attaching a view to a button will automatically display it under the NavBar
    home.attachedView = homeView;
};

navBar.top.AddAutoDisposingButton (UIImage.FromFile ("Icons/bar-chart.png"), true, false).RequestNewView += responder => {
    // Build new view from a .xib file and attach it to the button it will automatically
    // be displayed under the NavBar
    responder.attachedView = BarChartView.Factory (this);
};

//-----------------------------------------
// Add buttons to the bottom of the bar
//-----------------------------------------
navBar.bottom.AddButton (UIImage.FromFile ("Icons/gear.png"), true, false).RequestNewView += responder => {
    responder.attachedView = SettingsView.Factory (this, navBar);
};

Android Example:

// Gain Access to all views and controls in our layout
navBar = FindViewById<UINavBar> (Resource.Id.navBar);
viewHome = FindViewById<ImageView> (Resource.Id.viewHome);

//---------------------------------------------
// Add buttons to the top of the bar
//---------------------------------------------
// The first button added to the top collection will automatically be selected
UINavBarButton home = navBar.top.AddButton(Resource.Drawable.house,true,false);

// Wire up request for this button's view
home.RequestNewView += responder => {
    // Attach view to the button
    responder.attachedView=viewHome;
};

// Add Bar Chart
navBar.top.AddAutoDisposingButton (Resource.Drawable.barchart,true,false).RequestNewView += (responder) => {
    // Bring view into existance
    viewBarChart = (View)LayoutInflater.Inflate (Resource.Layout.ViewBarChart,null);

    // Attach view to the button
    responder.attachedView = viewBarChart;
};

//-----------------------------------------
// Add buttons to the bottom of the bar
//-----------------------------------------
navBar.bottom.AddAutoDisposingButton (Resource.Drawable.gear, true, false).RequestNewView += responder => {
    // Bring view into existance
    viewSettings = (View)LayoutInflater.Inflate (Resource.Layout.ViewSettings,null);

    // Attach view to the button
    responder.attachedView=viewSettings;

    // grab show/hide button
    showHideNavBar = FindViewById<Button> (Resource.Id.showHideButton);

    //-----------------------------------------
    // Wireup button action
    //-----------------------------------------
    if (showHideNavBar!=null) {
        showHideNavBar.Click += (sender, e) => {
            //Is the NavBar visible?
            navBar.Hidden=(!navBar.Hidden);
        };
    }
};

Adding Tool Buttons to your NavBar

Just like view buttons above, you can add tool buttons to your NavBar to respond to user interaction.

iOS Example:

//--------------------------------------------
// Add buttons to the middle of the bar
//--------------------------------------------
navBar.middle.AddTool (UIImage.FromFile ("Icons/printer.png"), true, false).Touched += responder => {
    // Display Alert Dialog Box
    using (var alert = new UIAlertView ("NavBar", "Sorry but printing is not available at this time.", null, "OK", null)) {
        alert.Show ();    
    }

    // Display warning notification in NavBar
    if (warning != null) warning.Hidden = false;
};

Android Example:

public string dialogMessage="";
...

//--------------------------------------------
// Add buttons to the middle of the bar
//--------------------------------------------
navBar.middle.AddTool (Resource.Drawable.printer,true,false).Touched+= (responder) => {
    // Inform user (dialogMessage defined as a global variable)
    dialogMessage="Sorry but printing is not supported at this time";
    ShowDialog (DialogLongMessage);

    // Display warning notification in NavBar
    if (warning != null) warning.Hidden = false;
};
... 

// Build dialog box when requested
protected override Dialog OnCreateDialog (int id)
{
    Dialog alert = null;
    AlertDialog.Builder builder;

    base.OnCreateDialog (id);

    // Build requested dialog type
    switch (id){
    case DialogLongMessage:
        builder = new AlertDialog.Builder(this);
        builder.SetIcon (Android.Resource.Attribute.AlertDialogIcon);
        builder.SetTitle ("NavBar");
        builder.SetMessage(dialogMessage);
        builder.SetPositiveButton ("OK", delegate(object sender, DialogClickEventArgs e) {
            // Ignore for now
        });
        alert=builder.Create ();
        break;
    case DialogLongMessageOkCancel:
        builder = new AlertDialog.Builder(this);
        builder.SetIcon (Android.Resource.Attribute.AlertDialogIcon);
        builder.SetTitle ("NavBar");
        builder.SetMessage(dialogMessage);
        builder.SetPositiveButton ("OK", delegate(object sender, DialogClickEventArgs e) {
            // Ignore for now
        });
        builder.SetNegativeButton ("Cancel", delegate(object sender, DialogClickEventArgs e) {
            // Ignore for now
        });
        alert=builder.Create ();
        break;
    }

    // Return dialog
    return alert;
}

Adding Notification Icons to your NavBar

NavBar also provides support for non-touchable notifications that can be displayed in any region of the bar: top, middle or bottom.

iOS Example:

warning = navBar.bottom.AddNotification (UIImage.FromFile ("Icons/warning.png"), null, true);

Android Example:

warning = navBar.bottom.AddNotification (Resource.Drawable.warning, null, true);

Initially Displaying your NavBar

Once you have loaded your NavBar and added the buttons, tools, and/or notifications required by you mobile application, you will need to do the following to initially display it.

iOS Example:

// Request that the initial view being controlled by the NavBar be displayed
navBar.DisplayDefaultView ();

Android Example:

protected override void OnStart ()
{
    base.OnStart ();

    //-----------------------------------------
    // Ask the Nav Bar to display the first view
    //-----------------------------------------
    navBar.DisplayDefaultView();
}

Building Sub UIViews for NavBar to Control in iOS

The NavBar Button and AutoDisposingButton types can automatically control a UIView attached to them when they issue a RequestNewView event. To create subviews in Xcode for these button types do the following:

First, add a UIView to the project and call it "SettingsView" which will create a SettingsView.xib file.

Next, add a C# class named "SettingsView.cs", and add the following code to it:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.CoreGraphics;
using MonoTouch.ObjCRuntime;

using Appracatappra.ActionComponents.Device;

namespace NavBarTester
{
    [Register ("SettingsView")]
    partial class SettingsView : UIView
    {
        #region Public Properties
        public UINavBar bar;
        #endregion 

        #region Static Class Methods
        /// <summary>
        /// The Factory assembles a <see cref="NavBarTester.SettingsView"/> from the SettingsView.xib file and
        /// instantiates it
        /// </summary>
        /// <param name="controller">The <see cref="MonoTouch.UIKit.UIViewController"/> this view will be attached to</param>
        /// <returns>A fully instantiated <see cref="NavBarTester.SettingsView"/></returns>
        public static SettingsView Factory(UIViewController controller, UINavBar bar){
            //Load the xib for the view
            var nibObjects = NSBundle.MainBundle.LoadNib("SettingsView", controller, null);

            //Assemble a view from the xib
            SettingsView view=(SettingsView)Runtime.GetNSObject(nibObjects.ValueAt(0));
            view.bar = bar;
            view.Frame = iOSDevice.AvailableScreenBounds;
            view.Initialize ();

            //Return fully instantiated view
            return view;
        }
        #endregion 

        #region Constructors
        public SettingsView() : base() {

        }

        public SettingsView(NSCoder coder): base(coder){

        }

        public SettingsView(NSObjectFlag flag): base(flag){

        }

        public SettingsView(RectangleF bounds): base(bounds){

        }

        public SettingsView(IntPtr ptr): base(ptr){

        }

        /// <summary>
        /// Initialize this instance.
        /// </summary>
        /// <remarks>Use this method to fully initialize your view setting up any outlets or actions
        /// specified in your .xib file</remarks>
        public void Initialize(){
            //TODO: Add you initialization code here, wire-up controls, events, etc.

        }
        #endregion
    }
}

NOTE: Without this file, you'll not be able to create outlets in Xcode for you new view. Now build your project and double-click the SettingsView.xib file, switch the type of the default view to SettingsView, and then add any needed elements and outlets to it. Save the file and return to Xamarin Studio.

Finally, edit the Initialize method of the SettingsView.cs file and wireup any outlets you've created in Xcode. Now your view is ready to use in your NavBar.

Ensuring Your NavBar Behaves as Expected on Android

As noted above you MUST set any view that will be controlled by the NavBar visibility to gone initially. This is a requirement as the NavBar controls views within its same RelativeLayout by adjusting their visibility.

If you wish to build the sub views as different .axml files you can, create an AddAutoDisposingButton and listen to it's RequestNewView event, load your subview using subView = (View)LayoutInflater.Inflate (Resource.Layout.subView,null); (or use a UIActionViewController see it's documentation for more details) and attach the subview to the UINavBarButton's attachedView property.

You also need to make sure that you override your Action's OnStart method and call the NavBar's DisplayDefaultView to ensure that the NavBar is correctly configured and that the required sub view is displayed. Example:

protected override void OnStart ()
{
    base.OnStart ();

    //-----------------------------------------
    // Ask the Nav Bar to display the first view
    //-----------------------------------------
    navBar.DisplayDefaultView();
}

Saving and Restoring NavBar State on Android

You are responsible for saving and restoring the state of your NavBar in response to things like device rotation. For any property that you wish to remember, override you Action's OnSaveInstanceState and save the properties to the Action's Bundle. Example:

protected override void OnSaveInstanceState (Bundle outState)
{
    //Save the NavBar's selected button before the state change
    outState.PutInt("SelectedButton",navBar.SelectedButtonId ());
    outState.PutBoolean("Hidden",navBar.Hidden);

    base.OnSaveInstanceState (outState);
}

During your Action's OnCreate method check for the existance of the Bundle file and reset your NavBar to the saved properties. Example:

...
//Are we rehydrating after a state change?
if (bundle!=null) {
    //Yes, attempt to restore the previously selected NavBar button
    navBar.rehydrationId=bundle.GetInt ("SelectedButton");
    navBar.Hidden=bundle.GetBoolean("Hidden");
}
...

Examples

For full examples of using NavBar in your mobile application please see the APTest.iOS or APTest.Android example app included with this component. NavBar is used in the APTest_iOSViewController_iPad.xib and APTest_iOSViewController_iPhone.xib files in iOS or the MainActivity.cs file in Android.

The test apps not only includes this documentation but it also includes the full API documentation for the entire ActionPack component suite.

See the API documentation for NavBar for a complete list of features and their usage.

Trial Version

The Trial version of NavBar is fully functional however the bar background is watermarked. The fully licensed version removes this watermark.

NavBar for iOS

You can find the full API documentation for NavBar iOS here:

http://appracatappra.com/api/ios/

 

NavBar for Android

You can find the full API documentation for NavBar Android here:

http://appracatappra.com/api/android/

At Appracatappra we take quality very seriously and always strive to provide the easiest to use and most trouble free Xamarin Studio Components available.

If you are experiencing an issue with one of our components or have a question about it's usage please either visit our support forum or fill out the request form below:

Your Name (required)

Your Email (required)

Subject

Component:

Device:

iPhone/iPod TouchiPadAndroid PhoneAndroid Tablet

OS Version:

Type:

Question/Issue

Verification:

captcha

Please enter the text above: