javascript - Appcelerator 中的自定义选项卡栏 - 如何返回根窗口?

标签 javascript ios titanium appcelerator appcelerator-mobile

我在 Appcelerator Titanium 上开发的 iOS 应用程序中有一个错误需要修复。

我一直在使用 customTabBar ( available on GitHub ) 创建一个定制的 tabBar,效果很好!

唯一的小问题是它删除了在图标上使用 tab 键并返回到根窗口的选项(就像 iOS 中的原生 tabBar 一样)。

因此,如果我在我的应用程序中向下钻取 3 或 4 个窗口,点击选项卡图标没有任何作用,我必须通过多次向后点击导航回到开头。

这是我正在使用的完整 customTabBar.js 脚本:

CustomTabBar = function(settings) {
var tabBarItems = [];
var tabCurrent = 2;

var resetTabs = function() {
    for(var i = 0; i < tabBarItems.length; i++) {
        // Clear all the images to make sure only
        // one is shown as selected
        tabBarItems[i].image = tabBarItems[i].backgroundImage;
    }
};

var assignClick = function(tabItem) {
    tabItem.addEventListener('click', function(e) {
        // Just fetching the 'i' variable from the loop
        var pos = e.source.pos;

        if (tabCurrent == pos) {
            // TODO
            // Change back to root window, like the native tab action.

            // code must go in here



            return false;
        }       

        // Switch to the tab associated with the image pressed
        settings.tabBar.tabs[pos].active = true;
        tabCurrent = pos;


        // Reset all the tab images
        resetTabs();

        // Set the current tab as selected
        tabBarItems[pos].image = settings.imagePath + settings.items[pos].selected;     
    });
};

// Create the container for our tab items
var customTabBar = Ti.UI.createWindow({
    height: 48,
    backgroundImage:'images/tabbarbackground.png',
    bottom: 0
});


for(var i = 0; i < settings.items.length; i++) {
    // Go through each item and create an imageView
    tabBarItems[i] = Titanium.UI.createImageView({
        // background is the default image
        backgroundImage: settings.imagePath + settings.items[i].image,

        width: settings.width,
        height: settings.height,
        left: settings.width * i
    });

    // Pass the item number (used later for changing tabs)
    tabBarItems[i].pos = i;
    assignClick(tabBarItems[i]);

    // Add to the container window
    customTabBar.add(tabBarItems[i]);
}

// Display the container and it's items
customTabBar.open();

// Set the first item as current :)
resetTabs();
//tabBarItems[0].image = settings.imagePath + settings.items[0].selected;
tabBarItems[2].image = settings.imagePath + settings.items[2].selected;

return {
    hide: function() { customTabBar.hide(); },
    show: function() { customTabBar.show(); }
};
};

包含我需要添加的位的函数已经被标记,但只是空的。在这里:

var assignClick = function(tabItem) {
    tabItem.addEventListener('click', function(e) {
        // Just fetching the 'i' variable from the loop
        var pos = e.source.pos;

        if (tabCurrent == pos) {
            // TODO
            // Change back to root window, like the native tab action.

            // code must go in here



            return false;
        }       

        // Switch to the tab associated with the image pressed
        settings.tabBar.tabs[pos].active = true;
        tabCurrent = pos;


        // Reset all the tab images
        resetTabs();

        // Set the current tab as selected
        tabBarItems[pos].image = settings.imagePath + settings.items[pos].selected;     
    });
};

最佳答案

customTabBar 在现有标签栏上放置一个窗口(实际上,只是一个 View )。然后它处理通过的点击。但是您必须处理单击事件以在选项卡之间切换,并且正如您所注意到的,跟踪堆栈中的所有窗口。

但是你知道吗?你太辛苦了。该平台已经为您完成了所有这一切。

传递点击事件(通过禁用叠加层上的触摸),底层选项卡组将发挥自己的魔力。然后您需要做的就是使用选项卡组的焦点事件更新 UI(evt.index 是焦点选项卡,evt.previousIndex 是模糊的)。

app.js:

Ti.include('overrideTabs.js');

/*
 This is a typical new project -- a tab group with three tabs.
 */

var tabGroup = Ti.UI.createTabGroup();

/*
 Tab 1.
 */
var win1 = Ti.UI.createWindow({ title: 'Tab 1', backgroundColor: '#fff' });
var tab1 = Ti.UI.createTab({
    backgroundImage: 'appicon.png',
    window: win1
});
var button1 = Ti.UI.createButton({
    title: 'Open Sub Window',
    width: 200, height: 40
});
button1.addEventListener('click', function (evt) {
    tab1.open(Ti.UI.createWindow({ title: 'Tab 1 Sub Window', backgroundColor: '#fff' }));
});
win1.add(button1);
tabGroup.addTab(tab1);

/*
 Tab 2.
 */
tabGroup.addTab(Ti.UI.createTab({
    backgroundImage: 'appicon.jpg',
    window: Ti.UI.createWindow({ title: 'Tab 2', backgroundColor: '#fff' })
}));

/*
 Tab 3.
 */
tabGroup.addTab(Ti.UI.createTab({
    backgroundImage: 'appicon.png',
    window: Ti.UI.createWindow({ title: 'Tab 3', backgroundColor: '#fff' })
}));

/*
 Now call the overrideTabs function, and we're done!
 */
overrideTabs(
    tabGroup, // The tab group
    { backgroundColor: '#f00' }, // View parameters for the background
    { backgroundColor: '#999', color: '#000', style: 0 }, // View parameters for selected tabs 
    { backgroundColor: '#333', color: '#888', style: 0 } // View parameters for deselected tabs
);

tabGroup.open();

overrideTabs.js:

    /**
 * Override a tab group's tab bar on iOS.
 *
 * NOTE: Call this function on a tabGroup AFTER you have added all of your tabs to it! We'll look at the tabs that exist
 * to generate the overriding tab bar view. If your tabs change, call this function again and we'll update the display.
 *
 * @param tabGroup The tab group to override
 * @param backgroundOptions The options for the background view; use properties like backgroundColor, or backgroundImage.
 * @param selectedOptions The options for a selected tab button.
 * @param deselectedOptions The options for a deselected tab button.
 */
function overrideTabs(tabGroup, backgroundOptions, selectedOptions, deselectedOptions) {
    // a bunch of our options need to default to 0 for everything to position correctly; we'll do it en mass:
    deselectedOptions.top = deselectedOptions.bottom
        = selectedOptions.top = selectedOptions.bottom
        = backgroundOptions.left = backgroundOptions.right = backgroundOptions.bottom = 0;

    // create the overriding tab bar using the passed in background options
    backgroundOptions.height = 50;
    var background = Ti.UI.createView(backgroundOptions);

    // pass all touch events through to the tabs beneath our background
    background.touchEnabled = false;

    // create our individual tab buttons
    var increment = 100 / tabGroup.tabs.length;
    deselectedOptions.width = selectedOptions.width = increment + '%';
    for (var i = 0, l = tabGroup.tabs.length; i < l; i++) {
        var tab = tabGroup.tabs[i];

        // position our views over the tab.
        selectedOptions.left = deselectedOptions.left = increment * i + '%';

        // customize the selected and deselected based on properties in the tab.
        selectedOptions.title = deselectedOptions.title = tab.title;
        if (tab.backgroundImage) {
            selectedOptions.backgroundImage = deselectedOptions.backgroundImage = tab.backgroundImage;
        }
        if (tab.selectedBackgroundImage) {
            selectedOptions.backgroundImage = tab.selectedBackgroundImage;
        }
        if (tab.deselectedBackgroundImage) {
            deselectedOptions.backgroundImage = tab.deselectedBackgroundImage;
        }
        selectedOptions.visible = false;
        background.add(tab.deselected = Ti.UI.createButton(deselectedOptions));
        background.add(tab.selected = Ti.UI.createButton(selectedOptions));


    }

    // update the tab group, removing any old overrides
    if (tabGroup.overrideTabs) {
        tabGroup.remove(tabGroup.overrideTabs);
    }
    else {
        tabGroup.addEventListener('focus', overrideFocusTab);
    }

    tabGroup.add(background);
    tabGroup.overrideTabs = background;
}

function overrideFocusTab(evt) {
    if (evt.previousIndex >= 0) {
        evt.source.tabs[evt.previousIndex].selected.visible = false;
    }
    evt.tab.selected.visible = true;
}

https://gist.github.com/853935

关于javascript - Appcelerator 中的自定义选项卡栏 - 如何返回根窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11341935/

相关文章:

ios - 目录名称无效 - 您的应用程序包含已保留的目录名称

javascript - 钛appcelerator sqlite

ios - CocoaPods 将重复项目添加到 xcworkspace

ios - 带参数的 MvxViewModelRequest

javascript - 选中时使元素 float 到 div 中心

javascript - 在nodejs中向外部模块添加功能

css - 钛的 ScrollView 有问题吗?

javascript - 如何与webview和titanium进行通信

javascript - Puppeteer:异步函数中的圆括号是什么意思?

javascript - 如何使用 should.js 进行 deepEqual 断言?