Phonegap Cordova Statusbar插件创建双栏 [英] Phonegap Cordova Statusbar Plugin creating double bars

查看:81
本文介绍了Phonegap Cordova Statusbar插件创建双栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用phonegap开发应用程序.通过CLI构建,而不是通过phonegap构建.我的cordova-plugin-statusbar插件有问题.启用后,它将增加一个额外的栏高度.这是它的样子.

I am working on an app using phonegap. Building through CLI, not phonegap build. I am having an issue with the cordova-plugin-statusbar plugin. It will add an extra bar height when turned on. Here is what it looks like.

双高菜单栏:

我已经通过两种方式实现了状态栏.首先通过将标签添加到config.xml

I have implemented the status bar in two ways. First by adding tags to config.xml

<platform name="ios">
    <preference name="StatusBarOverlaysWebView" value="false" />
    <preference name="StatusBarStyle" value="default" />
    <preference name="StatusBarBackgroundColor" value="#000000" />
</platform>

我还使用javascript完成了此操作(首先删除了config标签),并将以下内容添加到我的DeviceReady函数中

I have also done this with javascript, (by first removing the config tags) and adding the following to my DeviceReady function

StatusBar.overlaysWebView( false );
StatusBar.backgroundColorByHexString('#000000');
StatusBar.styleDefault(); 

要查看发生了什么,我已经更改了颜色,得到了

To see what was going on, i have changed the color and I get this

双重状态栏2种颜色:

当我删除所有内容或将overlaysWebView设置为"true"时,也没有空格,并且内容在菜单栏下.

also when I remove everything or set the overlaysWebView to 'true', I get no spacing and my content is under the menubar.

StatusBar.overlaysWebView( true );

这使我相信我没有CSS问题.此外,我经历了我的CSS,没有看到任何将添加此内容.到目前为止,我的CSS还是很基本的.

Which leads me to believe that I do not have a CSS issue. Also, i went through my css and do not see anything that would be adding this. my css is pretty basic so far.

/* Style Reset */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
    display: block;
}

body {
    line-height: 1;

}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}
/* End of style reset */

* {
    -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
}

body {
    -webkit-touch-callout: none;                /* prevent callout to copy image, etc when tap to hold */
    -webkit-text-size-adjust: none;             /* prevent webkit from resizing text to fit */
    -webkit-user-select: none;                  /* prevent copy paste, to allow, change 'none' to 'text' */
/*    background-color:#E4E4E4;
    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-webkit-gradient(
        linear,
        left top,
        left bottom,
        color-stop(0, #A7A7A7),
        color-stop(0.51, #E4E4E4)
    );
    background-attachment:fixed;*/
    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
    font-size:12px;
/*    height:100%;
    margin:0px;
    padding:0px;
    text-transform:uppercase;
    width:100%;*/
    background-color: #333333;
}

.md-button {
    color:#DFE5E6;
    background-color:#1D1D1D;
}

.md-button[disabled] {
  border: 1px solid black;
  color : rgba(0, 0, 0, 0.26);
  background-color: transparent;
}


/* Portrait layout (default) */
.app {
    background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
    position:absolute;             /* position in the center of the screen */
    left:50%;
    top:50%;
    height:50px;                   /* text area height */
    width:225px;                   /* text area width */
    text-align:center;
    padding:180px 0px 0px 0px;     /* image height is 200px (bottom 20px are overlapped with text) */
    margin:-115px 0px 0px -112px;  /* offset vertical: half of image height and text area height */
                                   /* offset horizontal: half of text area width */
}

/* Landscape layout (with min-width) */
@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) {
    .app {
        background-position:left center;
        padding:75px 0px 75px 170px;  /* padding-top + padding-bottom + text area = image height */
        margin:-90px 0px 0px -198px;  /* offset vertical: half of image height */
                                      /* offset horizontal: half of image width and text area width */
    }
}

/* Custom Fonts */
@font-face {
    font-family: "sapient_sans_regular";
    src: url("../fonts/sapient_sans_regular.TTF") format("opentype"); 
}
@font-face {
    font-family: "sapient_sans_regular_italic";
    src: url("../fonts/sapient_sans_regular_italic.TTF") format("opentype"); 
}
@font-face {
    font-family: "sapient_sans_bold";
    src: url("../fonts/sapient_sans_bold.TTF") format("opentype"); 
}
@font-face {
    font-family: "sapient_sans_bold_italic";
    src: url("../fonts/sapient_sans_bold_italic.TTF") format("opentype"); 
}


.material-icons {
    margin:0px;
    color:white; 
    height:40px; 
    width:40px; 
    line-height:40px;
    vertical-align: middle;
    text-align: center;
    background: #1D1D1D;
}
.material-icons.md-menu-item.md-icon {
    text-align: left;
}

.material-icons.menuItem {
    background: transparent;
    color:#DFE5E6; 
}

#menuBar ul {
    position:fixed;
    top:0;
    width:100%;
    list-style-type: none;
    background-color: #1D1D1D;
}
#menuBar li {
    text-align:center;
    display: inline;
}

.logo {
    line-height:11px;
    padding:13px 2px;
    display: inline-block;
    vertical-align: middle;
    //float:left;
    //margin: auto;
    overflow: auto;
    width:100%;
    background-color: #1D1D1D;
    border-bottom: 1px solid white;
}
.my {
    //line-height:40px;
    text-transform: capitalize;
    font-family: "sapient_sans_bold";
    //display: inline-block;
    font-size:20px;
    color: #DFE5E6;
}
.company {
    //line-height:40px;
    text-transform: capitalize;
    font-family: "sapient_sans_bold";
    font-size:20px;
    color: #6D6E70;
}

#menuListing ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
    width: 100%;
    background-color: #f1f1f1;
}

#menuListing li a {
    font-family:'sapient_sans_regular';
    display: block;
    color: #000;
    padding: 8px 16px;
    text-decoration: none;
}

/* Change the link color on hover */
#menuListing li a:hover {
    background-color: #555;
    color: white;
}
.content {
    color: white;
    padding:10px;
}

h1 {
    font-size:18px;
    font-weight:normal;
    //margin:0px;
    //overflow:visible;
    //padding:0px;
    //text-align:center;
}

.hidden {
    display: none;
}

#map
{

    //margin: auto;
    //width: 100%;
    border: 3px solid green;
    padding: 100px;
    //height: 90%;
    //width: 60%;
}

我尝试卸载并重新安装插件和ios平台,但未对此问题进行任何更改.

I have tried uninstalling and reinstalling the plugin and the ios platform with no change to the issue.

我已经在多个IOS模拟器(不同的手机)上对此进行了测试,并且结果均相同,但是我还没有直接在设备上进行过测试,但是我怀疑它会有所不同.

I have tested this on multiple IOS simulators (different phones) and all have the same result, I have not tested directly on a device yet, but I doubt it would be different.

我注意到android也有一个状态栏缓冲区(即使它不应该),但它只是单个白条.我认为这会建议使用CSS,但是运行时在浏览器中看不到

I have noticed that android also has a status bar buffer (even though it should not), but it is only the single white bar. I assume that would suggest CSS, but i do not see this in the browser when I run

phonegap服务

phonegap serve

快速更新:我正在从statusBar休息一下,并努力使我的google maps插件也能工作,我进行了一些更改,状态栏现在似乎正在工作.一定有某种互动.去看看我是否能弄清楚到底是什么.

Quick Update: I am taking a break from the statusBar and working on getting my google maps plugin to also work, I made some changes and the status bar seems to be working now. There must have been some sort of interaction. Going to see if i could figure out what exactly.

一些HTML供参考 Index.html

Some HTML for reference Index.html

<!DOCTYPE html>
<html ng-app="snApp">
<head>

    <title>My Test App</title>
</head>

<!-- Actual Content -->
<body ng-cloak>

    <div ng-include="'app/menuBar/menuBar.html'"></div>
    <!-- Main content Area -->
    <md-content flex id="main">
        <ng-view></ng-view>
    </md-content>

</body>
</html>

MenuBar.html(请注意,我已经从原始帖子中进行了一些调整.我试图还原它们.)

MenuBar.html (note, i have made some adjustments from this original posting. I have tried to revert them.)

<div ng-controller="menuBarController as menuBarController" id="menuBarContainer">

<md-toolbar id="menuBar" class="md-short" layout="row">
    <div class="menuButton">
        <md-icon ng-click="menuBarController.toggleLeftMenu();" md-font-library="material-icons">menu</md-icon>
    </div>

    <div class="logo">
        <span class="my">My</span><!-- this removes the space (for some reason) --><span class="app">App</span>
    </div>
</md-toolbar>

<md-sidenav md-component-id="left" class="md-sidenav-left" >
    <md-menu-item>
    </md-menu-item> <!-- remove this after adding in the buffer -->

    <md-menu-item>
        <md-button ng-click="menuBarController.toggleLeftMenu();" ng-href="#/"> 
            <md-icon md-font-library="material-icons" class="menuItem">home
            </md-icon> Home
        </md-button>
    </md-menu-item>

    <md-menu-item>
        <md-button ng-click="menuBarController.toggleLeftMenu();" ng-href="#/locations">
            <md-icon md-font-library="material-icons" class="menuItem">location_city
            </md-icon>Locations
        </md-button>
    </md-menu-item>

    <md-menu-item>
        <md-button ng-click="menuBarController.toggleLeftMenu();" ng-href="#/map">
            <md-icon md-font-library="material-icons" class="menuItem">map
            </md-icon>Map
        </md-button>
    </md-menu-item>

    <md-menu-item>
        <md-button ng-click="menuBarController.toggleLeftMenu();" ng-href="#/navigate">
            <md-icon md-font-library="material-icons" class="menuItem">navigation
            </md-icon>Navigate
        </md-button>
    </md-menu-item>

    <md-menu-item>
        <md-button ng-click="menuBarController.toggleLeftMenu();" ng-href="#/about">
            <md-icon md-font-library="material-icons" class="menuItem">info
            </md-icon>About
        </md-button>
    </md-menu-item>
</md-sidenav>
</div>

MenuBar的控制器

Controller for MenuBar

console.log("menuBar.controller.js file loaded");

snApp.controller('menuBarController', ['$mdSidenav', '$window', MenuBarController]);


function MenuBarController($mdSidenav, $window) {
    var vm = this;

    // vm.operatingSystem = $window.operatingSystem;
    vm.operatingSystem = null;
    vm.toggleLeftMenu = toggleLeftMenu;
    vm.checkForIos = checkForIos;

    function toggleLeftMenu() {
        $mdSidenav('left').toggle();
    }
}

查看示例-Home.html页面现在非常简单,可以进行测试:

View example - Home.html page is super simple right now for testing:

<!-- home.html -->
<div class="content" ng-controller="HomeController as home">
    <h1>Home Page</h1>
    <p>{{ home.message }}</p>
</div>

home.controller.js

home.controller.js

console.log("home.controller.js file loaded");

angular.module('snApp')
.controller("HomeController", HomeController);

function HomeController() {
    //debugger;
    var vm = this;
    vm.message = "this is a home message";
}

map.html-这是地图视图-里面有很多用于测试的东西.

map.html - Here is the maps view - a lot is in there just for testing right now.

<!-- map.html -->
<div class="content" ng-controller="MapController as map">
    <h1>Map Page</h1>
    <md-content  layout-gt-sm="row" layout-padding>
        <md-button ng-click="map.setMapToDiv();">show map</md-button>
        <md-button ng-click="map.getLocation();" ng-disabled="map.buttonDisabled">{{ map.buttonText }}</md-button>
        <md-input-container>
            <label>Div Adjustent</label>
            <input ng-model="map.divAdjustment">
        </md-input-container>
        <md-button ng-click="map.adjustDiv();" > Adjust Div Height </md-button>
        <p></p>
        <p>For testing - buttonEnabled value: <span ng-bind="map.buttonDisabled"></span></p>
        <p>{{ map.latitude }}</p>
        <p>{{ map.longitude }}</p>
        <p>{{ map.message }}</p>
        <p></p>
        <md-button ng-click="map.showMapDialog();">make map full screen</md-button>
        <!-- <div id="map" ng-show="map.locationUpdated"> -->
        <div id="map" ng-show="true"></div>
    </md-content>
</div>

map.controller.js

map.controller.js

    console.log("map.controller.js file loaded");

angular.module('snApp')
.controller("MapController", ['$scope', MapController]);

function MapController($scope) {
    // Variables
    var vm = this;
    vm.latitude = 0;
    vm.longitude = 0;
    vm.locationUpdated = false;
    vm.buttonTextDefault = "Get Location";
    vm.buttonText = vm.buttonTextDefault;
    vm.buttonDisabled = false;

    vm.divAdjustment = 0;
    vm.message = "Map will display after getting Geolocation";

    // Method Declarations
    vm.getLocation = getLocation;
    vm.setMapToDiv = setMapToDiv;
    vm.showMapDialog = showMapDialog;
    // vm.adjustDiv = adjustDiv;

    // Gets the Current Geolocation for user
    function getLocation() {
        vm.buttonDisabled = true;
        vm.buttonText = "Working...";
        var options = { maximumAge: 0, timeout: 10000, enableHighAccuracy: true };
        navigator.geolocation.getCurrentPosition(getLocationSuccess,getLocationError,options);
        vm.buttonDisabled = false;
    }

    function getLocationSuccess(position) {
        console.log("found geolocation");
        vm.latitude = position.coords.latitude;
        vm.longitude = position.coords.longitude;
        vm.buttonText = vm.buttonTextDefault;
        googleMaps.positionMapToCoords(vm.latitude, vm.longitude);
        vm.locationUpdated = true;
        $scope.$apply();
    }

    function getLocationError(error) {
        console.log("Error finding geolocation");
        alert('code: '    + error.code    + '\n' +
                'message: ' + error.message + '\n');
        vm.buttonText = vm.buttonTextDefault;
        $scope.$apply();
    }

    function setMapToDiv() {
        googleMaps.setMapToDiv();
    }

    function showMapDialog() {
        googleMaps.showMapDialog();
    }

}

推荐答案

如果有人碰到这个问题,将会遇到同样的问题.我基本上发现了一个解决方案,它更多是一种解决方法,而不是直接的答案,但可能会有所帮助.我决定仍然使用该插件为文本正确上色,但其余部分则由我手动管理.

If anyone bumps into this, having the same issues. I basically found a solution that was more of a workaround rather than a direct answer, but might be helpful. I decided to use the plugin still for coloring the text properly, but the rest I am managing manually.

    StatusBar.overlaysWebView(true);
    StatusBar.backgroundColorByHexString('#1D1D1D');
    StatusBar.styleLightContent();

然后是一些CSS

#statusBar {
    background-color:#1D1D1D;
    width:100%;
    min-width:100%;
    overflow: auto;
    min-height:20px;
    height:20px;
}

我将此div作为菜单栏的一部分.菜单栏是其自己的角度分量.在控制器中,我有一种检查操作系统版本的方法.感谢这篇文章:检测iOS/Android操作系统

I have this div as a part of my menu bar. The menu bar is its own angular component. In the controller, i have a method that checks for the OS version. thanks to this post: Detecting iOS / Android Operating system

snApp.controller('menuBarController', ['$mdSidenav', '$window', '$googleMapsService', MenuBarController]);


function MenuBarController($mdSidenav, $window, $googleMapsService) {
    var vm = this;
    var leftMenuId = 'left';
    vm.isIosValue = false;

    vm.$onInit = function() {
        vm.isIosValue = vm.checkForIos();
    }

    vm.operatingSystem = null;
    vm.toggleLeftMenu = toggleLeftMenu;
    vm.getMobileOperatingSystem = getMobileOperatingSystem;
    vm.checkForIos = checkForIos;
    vm.isIos = isIos;

    vm.googleMaps = $googleMapsService;

    function toggleLeftMenu() {
        mapDivManagement();
        $mdSidenav(leftMenuId).onClose(mapDivManagement).toggle();
    }

    function mapDivManagement() {
        if(vm.googleMaps.checkMap() && $window.location.hash == "#/map")
        {
            if($mdSidenav(leftMenuId).isOpen()) {
                console.log("vm.googleMaps.revealMap(true);");
                vm.googleMaps.revealMap(true);
            }
            else {
                console.log("vm.googleMaps.revealMap(false);");
                vm.googleMaps.revealMap(false);
            }
        }
    }


    /**
     * Determine the mobile operating system.
     * This function sets global variable to one of 'iOS', 'Android', 'Windows Phone', or 'unknown'.
     *
     * @returns {String}
     *
     * Source: https://stackoverflow.com/questions/21741841/detecting-ios-android-operating-system
     */
    function getMobileOperatingSystem() {
        var userAgent = navigator.userAgent || navigator.vendor || window.opera;
        //debugger;
          // Windows Phone must come first because its UA also contains "Android"
        if (/windows phone/i.test(userAgent)) {
            // return "Windows Phone";
            vm.operatingSystem =  "Windows Phone";
        }
        else if (/android/i.test(userAgent)) {
            // return "Android";
            vm.operatingSystem =  "Android";
        }
        // iOS detection from: https://stackoverflow.com/a/9039885/177710
        else if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
            // return "iOS";
            vm.operatingSystem =  "iOS";
        }
        else {
            vm.operatingSystem =  "unknown";
        }
            // return "unknown";
    }

    function checkForIos() {
        vm.getMobileOperatingSystem();
        //vm.operatingSystem = $window.operatingSystem;
        if(vm.operatingSystem == 'iOS') {
            return true;
        }
        else {
            return false;
        }
    }

    function isIos() {
        return vm.isIosValue;
    }
}

最后,在我的menubar.html文件中,我有以下div:

Finally, in my menubar.html file, I have this div:

    <!-- Status Bar -->
<div ng-show="menuBarController.isIos()" id="statusBar"></div>

,它将根据操作系统显示或隐藏div.

which will show or hide the div based on the OS.

不确定如何在通话中将其全部工作,但否则会带给您很大的帮助.

Not sure how this will all work in a call, but it gets you pretty far otherwise.

这篇关于Phonegap Cordova Statusbar插件创建双栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆