Phonegap이있는 iOS 7 상태 표시 줄


91

iOS 7에서는 Phonegap 애플리케이션이 상태 표시 줄 아래에 나타납니다. 이로 인해 화면 상단에있는 버튼 / 메뉴를 클릭하기가 어려울 수 있습니다.

Phonegap 애플리케이션의 iOS 7에서이 상태 표시 줄 문제를 해결하는 방법을 아는 사람이 있습니까?

CSS로 전체 웹 페이지를 오프셋하려고 시도했지만 작동하지 않는 것 같습니다. 전체 UIWebView를 오프셋하거나 상태 표시 줄이 iOS6에서와 같이 동작하도록 만드는 방법이 있습니까?

감사


"상태 표시 줄 문제"가 정확히 무엇입니까? 재현 할 샘플 코드가 있습니까?
Raptor

1
@ShivanRaptor iOS 7에서는 상태 표시 줄이 이제보기의 일부이므로 이전 iOS 버전에서 화면 상단에 있던 항목이 있으면 상태 표시 줄 아래에 있으며 바로 아래에 자동으로 푸시되지 않습니다. 몇 가지 문제가 발생할 수 있습니다. 내 제안은 콘텐츠에 대한 래퍼를 만들고 여백 상단을 20px로 설정하는 것입니다.
Andrew Lively

@AndrewLively-페이지가 스크롤 될 때 실제로 작동하지 않습니다. UIWebView를 이동할 수있는 방법이 있습니까?
Luddig 2013 년

답변:


143

다른 스레드에서 답변을 찾았지만 다른 사람이 궁금해 할 경우 질문에 답변하겠습니다.

그냥 교체 viewWillAppearMainViewController.m이와 :

- (void)viewWillAppear:(BOOL)animated {
    // View defaults to full size.  If you want to customize the view's size, or its subviews (e.g. webView),
    // you can do so here.
    // Lower screen 20px on ios 7
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
    }
    [super viewWillAppear:animated];
}

9
다른 사람이 In App Browser 플러그인으로 이것을 사용하고 있습니까? In App Browser를 "presentationstyle = fullscreen"으로 구성하면 브라우저를 닫은 후 빈 아래쪽 여백이 나타납니다. 여백이 InAppBrowser 툴바와 같은 높이 인 것 같습니다. 프레젠테이션 유형을 "페이지 시트"로 설정하면 iPad에서이 문제가 해결되지만 iPhone은 항상 "전체 화면"을 사용하는 것 같습니다. 해결 방법이 있습니까?

1
답변에 매우 감사하지만 PhoneGap inApp 브라우저에도 동일한 문제가 적용되며 상태 표시 줄도 오버레이됩니다. 그것에 대한 아이디어가 있습니까?
Michael

2
예, 이전 버전의 Cordova (2.3.0)를 사용하고 있으며이 문제를 해결하려면 webViewBounds.origin.y = 20을 설정해야합니다. createViewsWithOptions에서. 또한 배경색이 설정되어 있는지 확인하고 그와 함께 놀아보십시오. LudWig Kristoffersson의 훌륭한 답변에서와 같이 iOS7 이상 버전 확인을 수행하십시오.
hnilsen

3
또한-InAppBrowser를 사용하는 경우 돌아올 때마다보기가 다시 초기화됩니다. 따라서 MainViewController.m에 이미 실행되었다는 플래그를 추가하는 것이 현명 할 것입니다.
hnilsen

14
이 코드는 viewWillAppear에서 실행되기 때문에 PhoneGap / Cordova 앱이 다른 기본보기 (예 : 카메라 캡처 대화 상자)를 표시하고이보기로 돌아 오는 경우이 솔루션에 문제가 발생합니다. 나를위한 수정은 '[self.webView bounds]'대신 '[self.view bounds]'로 'viewBounds'를 초기화하는 것이 었습니다.
Chris Karcher 2013

37

Ludwig Kristoffersson의 크기 조정 수정 외에도 상태 표시 줄 색상을 변경하는 것이 좋습니다.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
    }
    self.view.backgroundColor = [UIColor blackColor];
}
-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

1
작업 위대한 :) 고마워요 :)
rkaartikeyan

완벽합니다. 이것이 저에게 더 나은 솔루션이었습니다.
David Daudelin 2014 년

이 수정은 Xcode 빌드 후에 로컬로 작동하지만 phonegap 빌드를 수행 한 후에는 작동하지 않습니다. 어떤 아이디어? phonegap 2.9로 빌드 된 iOS 앱이 있습니다
DemitryT 2014

이 솔루션은 작동하지만 전체 화면 비디오에 문제가 있었고 다른 비디오를 찾아서 문제를 해결했습니다. zsprawl.com/iOS/2013/10/fixing-the-phonegap-status-bar-in-ios7
magorich

1
@KirankumarSripati 실제로 내 마지막 해결책은 이것이 당신을 위해 일하기를 바랍니다 NSInteger screenSize = 0; // Global if ([[[UIDevice currentDevice] systemVersion] floatValue]> = 7) {CGRect viewBounds = [self.webView bounds]; viewBounds.origin.y = 20; if (screenSize == 0) {viewBounds.size.height = viewBounds.size.height-20; screenSize = viewBounds.size.height; } self.webView.frame = viewBounds; } 전체 화면으로 들어갈 때마다 앱의 크기가 조정 되었기 때문에 그렇게했습니다.
magorich

22

phonegap 용 플러그인을 설치하십시오 : https://build.phonegap.com/plugins/505

그리고 아래와 같이 올바른 설정을 사용하여 webview의 오버레이를 제어하십시오.

<preference name="StatusBarOverlaysWebView" value="false" />

나를 위해 Phonegap 3.3.0에서는 작동합니다.

자세한 내용은 Github 프로젝트 페이지 : https://github.com/phonegap-build/StatusBarPlugin


이 답변에 감사드립니다 !! 이 플러그인으로 시도했습니다 : build.phonegap.com/plugins/715 , 문제는 이름이 동일하다는 것입니다. 하지만 나를 위해 일하지 않습니다. 감사합니다 !!
Jabel Márquez 2014-06-05

솔직히 말해서 내가 당신이 언급 한 이전에 시도했는지 기억이 나지 않습니다.
xdemocle

20

상태 표시 줄을 숨기려면 MainViewController.m함수 아래의 파일 에 다음 코드를 추가하십시오.-(void)viewDidUnload

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

이것은 일을합니다. 앱을 전체 화면으로 만드는 상태 표시 줄을 숨 깁니다. 시뮬레이터에서만 테스트했지만 나중에 iPhone 및 iPad에서 빌드를 실행할 때 다시보고 할 것입니다.
Rob Evans

iPad 2의 iOS에서 작동합니다
Mark Williams

이것은 iPad Air iOS 7.1.2에서 잘 작동하며 변경이나 플러그인이 필요하지 않습니다. 좋은 대답, 감사합니다!
Scriptlabs 2014-08-06

이것은 Apple이 Human Interface Guidelines에서 '몰입 형 전체 화면 모드'에 대해 말하는 모든 것을 완전히 무시합니다 ... iOS 위에 래퍼를 사용한다고해서 디자인 패턴을 무시할 수 있다는 의미는 아닙니다 ... : /
jesses .co.tt

15

답변 https://stackoverflow.com/a/19249775/1502287 이 저에게 효과적이지만 카메라 플러그인 (및 잠재적으로 다른 사용자)과 "height = device- 높이 "(높이 부분을 설정하지 않으면 내 경우에는 키보드가 뷰 위에 나타나고 도중에 일부 입력이 숨겨집니다).

카메라 뷰를 열고 앱으로 돌아갈 때마다 viewWillAppear 메서드가 호출되고 뷰가 20px만큼 축소됩니다.

또한 뷰포트의 장치 높이에는 20 픽셀의 추가 픽셀이 포함되어 콘텐츠를 스크롤 가능하고 웹뷰보다 20 픽셀 더 높게 렌더링합니다.

다음은 카메라 문제에 대한 완전한 솔루션입니다.

MainViewController.h에서 :

@interface MainViewController : CDVViewController
@property (atomic) BOOL viewSizeChanged;
@end

MainViewController.m에서 :

@implementation MainViewController

@synthesize viewSizeChanged;

[...]

- (id)init
{
    self = [super init];
    if (self) {
        // On init, size has not yet been changed
        self.viewSizeChanged = NO;
        // Uncomment to override the CDVCommandDelegateImpl used
        // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self];
        // Uncomment to override the CDVCommandQueue used
        // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self];
    }
    return self;
}

[...]

- (void)viewWillAppear:(BOOL)animated
{
    // View defaults to full size.  If you want to customize the view's size, or its subviews (e.g. webView),
    // you can do so here.
    // Lower screen 20px on ios 7 if not already done
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7 && !self.viewSizeChanged) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
        self.viewSizeChanged = YES;
    }
    [super viewWillAppear:animated];
}

이제 뷰포트 문제에 대해 deviceready 이벤트 리스너에 다음을 추가하십시오 (jQuery 사용).

if (window.device && parseFloat(window.device.version) >= 7) {
  $(window).on('orientationchange', function () {
      var orientation = parseInt(window.orientation, 10);
      // We now the width of the device is 320px for all iphones
      // Default height for landscape (remove the 20px statusbar)
      var height = 300;
      // Default width for portrait
      var width = 320;
      if (orientation !== -90 && orientation !== 90 ) {
        // Portrait height is that of the document minus the 20px of
        // the statusbar
        height = document.documentElement.clientHeight - 20;
      } else {
        // This one I found experimenting. It seems the clientHeight
        // property is wrongly set (or I misunderstood how it was
        // supposed to work).
        // Dunno if it's specific to my setup.
        width = document.documentElement.clientHeight + 20;
      }
      document.querySelector('meta[name=viewport]')
        .setAttribute('content',
          'width=' + width + ',' +
          'height=' + height + ',' +
          'initial-scale=1.0,maximum-scale=1.0,user-scalable=no');
    })
    .trigger('orientationchange');
}

다른 버전에 사용하는 뷰포트는 다음과 같습니다.

<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0" />

이제 모든 것이 잘 작동합니다.


JQuery와 @dieppe없이 모든 방법
아르 준 T 라즈

카메라 문제도 해결하는 CDVCamera.m 내부의-(void) imagePickerController : (UIImagePickerController *) picker didFinishPickingMediaWithInfo : (NSDictionary *) info {} 메서드에이 코드를 추가하기 만하면됩니다. NSLog (@ "닫힌 카메라"); [[UIApplication sharedApplication] setStatusBarHidden : YES withAnimation : UIStatusBarAnimationNone];
Arjun T Raj

야, 감사하다는 말을 모르겠어! 카메라의 20px 축소 문제로 어려움을 겪고 있었지만 지금까지 해결책을 찾을 수 없었습니다 ...
tuks

6

(app name)-Info.plistXCode 의 앱 파일로 이동하여 키를 추가하십시오.

view controller-based status bar appearance: NO
status bar is initially hidden : YES

이것은 문제없이 나를 위해 작동합니다.


나에게 이것은 로컬 빌드가있는 시뮬레이터에서 작동하지만 원격 빌드가있는 iPad에서는 작동하지 않습니다. 빌드에 PG 3.1을 사용하고 시뮬레이터와 iPad에서 iOS7을 사용합니다.
Quested Aronsson 당

@PerQuestedAronsson iPad에서 로컬로 빌드 해 볼 수 있습니다. 나는 문제없이 phonegap 3.1이 설치된 iPad iOS7을 사용하고 있습니다.
dk123

6

Cordova 3.1+의 경우 iOS 7+의 상태 표시 줄 동작 변경을 처리하는 플러그인이 있습니다.

상태 표시 줄을 iOS7 이전 상태로 되돌릴 수있는 방법을 포함하여 여기에 잘 설명되어 있습니다 .

플러그인을 설치하려면 다음을 실행하십시오.

cordova plugin add org.apache.cordova.statusbar

그런 다음 config.xml에 추가하십시오.

<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="StatusBarStyle" value="default" />

기본적으로 검은 색인 StatusBar 색상을 설정할 수도 있습니다. <preference name = "StatusBarBackgroundColor"value = "# 000000"/> 참조 : plugins.cordova.io/#/package/org.apache.cordova.statusbar
ezzadeen

2
코르도바 5+를 들어, 플러그인은 이름이 변경되었습니다 : 코르도바 플러그인 코르도바 - 플러그인 - 상태 표시 추가
raider33

5

나는 설치하고 org.apache.cordova.statusbar내 상단에 추가하여 내 문제를 해결합니다 config.xml.

<preference name="StatusBarOverlaysWebView" value="false" /> 
<preference name="StatusBarBackgroundColor" value="#000000" />
<preference name="StatusBarStyle" value="lightcontent" />

이 구성은 iOS 7 이상에서만 작동합니다.

참조 : http://devgirl.org/2014/07/31/phonegap-developers-guid/



1

iOS7이 감지되면 다음 코드를 사용하여 본문에 클래스를 추가합니다. 그런 다음 해당 클래스의 스타일을 지정하여20px 컨테이너 상단에 여백 . "device"플러그인이 설치되어 있고이 코드가 "deviceready"이벤트 내에 있는지 확인하십시오.

읽어 보니 Phonegap (3.1)의 다음 업데이트가 iOS7의 상태 표시 줄에 대한 변경 사항을 더 잘 지원할 것이라고 들었습니다. 따라서 이것은 단기 수정으로 필요할 수 있습니다.

if(window.device && parseFloat(window.device.version) >= 7){
  document.body.classList.add('fix-status-bar');
}


1

또 다른 방법은 이전 버전과 호환되는 것 입니다. iOS 7(위에 20px 추가 여백이있는) 에 따라 HTML을 만들어 그 full screen모양 을 제공하고 iOS < 7.0. 다음과 같은 것 MainViewController.m:

- (void)viewDidLoad
{
  [super viewDidLoad];

  if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0) {
    CGRect viewBounds = [self.webView bounds];
    viewBounds.origin.y = -20;
    viewBounds.size.height = viewBounds.size.height + 20;
    self.webView.frame = viewBounds;
  }
}

이 솔루션은 iOS 7.0최신 iOS 사용자가 이상하고 오래된 .


0

내부에 다음과 같은 코드를 작성 AppDelegate.m 에서 didFinishLaunchingWithOptions의 이벤트 (정확하게 코드의 마지막 줄 앞에 " 반환 YES를, ") :

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
    [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

여러분의 피드백을 기다리겠습니다! :)


이 코드는 상태 표시 줄을 숨기고 문제를 해결하는 데 잘 작동하는 것 같습니다. 어제 조금 둘러보고 UIWebView의 크기를 기본적으로 조정하고 아래로 이동 한 코드의 평화를 찾았습니다.이 코드도 답변으로 추가했습니다. :)
Luddig

훌륭합니다. 내 코드는 간단하고 쉬운 방법을 사용하고 있습니다! 우리 모두는 다른 방법으로 똑같은 일을하고 있습니다 :)
Ehsan

0

이미지 갤러리에 카메라 플러그인을 사용하면 상태 표시 줄이 다시 표시되므로 문제를 해결하려면이 줄을 추가하세요.

 [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info {...}

플러그인 목록의 CVDCamera.m 내부 함수


0

내부에 다음과 같은 코드를 작성 AppDelegate.m 에서 didFinishLaunchingWithOptions의 시작에서 이벤트를.

CGRect screenBounds = [[UIScreen mainScreen] bounds]; // Fixing status bar ------------------------------- NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] >= 7) { // iOS 7 or above CGRect newWebViewBounds = CGRectMake( 0, 20, screenBounds.size.width, screenBounds.size.height-20 ); screenBounds = newWebViewBounds; } // ------------------------------- Fixing status bar End

iOS 7 이상에서 수정하십시오.


0

상태 표시 줄을 세로로 표시하고 가로로 (예 : 전체 화면) 숨기려면 다음을 시도하십시오.

에서 MainViewController.h:

@interface MainViewController : CDVViewController
@property (atomic) NSInteger landscapeOriginalSize;
@property (atomic) NSInteger portraitOriginalSize;
@end

에서 MainViewController.m:

@implementation MainViewController

@synthesize landscapeOriginalSize;
@synthesize portraitOriginalSize;

...

- (void)viewWillAppear:(BOOL)animated
{
    // View defaults to full size.  If you want to customize the view's size, or its subviews (e.g. webView),
    // you can do so here.

    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)orientationChanged:(NSNotification *)notification {
    [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}

- (void)viewDidDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
        CGRect frame = self.webView.frame;

        switch (orientation)
        {
            case UIInterfaceOrientationPortrait:
            case UIInterfaceOrientationPortraitUpsideDown:
            {
                if (self.portraitOriginalSize == 0) {
                    self.portraitOriginalSize = frame.size.height;
                    self.landscapeOriginalSize = frame.size.width;
                }
                frame.origin.y = statusBarFrame.size.height;
                frame.size.height = self.portraitOriginalSize - statusBarFrame.size.height;
            }
                break;

            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
            {
                if (self.landscapeOriginalSize == 0) {
                    self.landscapeOriginalSize = frame.size.height;
                    self.portraitOriginalSize = frame.size.width;
                }
                frame.origin.y = 0;
                frame.size.height = self.landscapeOriginalSize;
            }
                break;
            case UIInterfaceOrientationUnknown:
                break;
        }

        self.webView.frame = frame;
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.

    // Change this color value to change the status bar color:
    self.view.backgroundColor = [UIColor colorWithRed:0/255.0f green:161/255.0f blue:215/255.0f alpha:1.0f];
}

이것은 내가 이것과 연결된 StackOverflow 토론에서 찾은 것, Cordova StatusBar 플러그인의 일부 코드 (20px 값을 하드 코딩하지 않도록) 및 내 부분의 일부 주문 (iOS 개발자가 아니므로 나는이 해결책에 내 길을 더듬었다).


0

먼저 프로젝트에 장치 플러그인을 추가하십시오. 플러그인 ID : org.apache.cordova.device 및 저장소 : https://github.com/apache/cordova-plugin-device.git

그 후이 기능을 사용하고 모든 페이지 또는 화면에서 호출하십시오.

function mytopmargin() {
    console.log("PLATform>>>" + device.platform);
    if (device.platform === 'iOS') {
        $("div[data-role='header']").css("padding-top", "21px");
        $("div[data-role='main']").css("padding-top", "21px");
    } else {
        console.log("android");
    }
}

0

상태 표시 줄 배경을 제어하는 ​​가장 좋은 방법-2017

지속적인 좌절, 인터넷에서 많은 검색을 한 후에 수행해야 할 단계는 다음과 같습니다.

  1. 당신이 사용하는지 확인하십시오 상태 표시 줄 플러그인
  2. 이 설정을 config.xml에 추가하십시오.

<preferences name = "StatusBarOverlaysWebView"value = "false"/>

  1. onDeviceReady 에서 다음 코드를 사용하십시오.

        StatusBar.show();
        StatusBar.overlaysWebView(false);
        StatusBar.backgroundColorByHexString('#209dc2');

iOS 및 Android에서 작동합니다.

행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.