pasek stanu iOS 7 nakładający się interfejs użytkownika

Niedawno zaktualizowałem do xcode 5 i kiedy uruchamiam moją aplikację w symulatorze iOS ekran powitalny nakłada się na pasek stanu, a kiedy jesteś w aplikacji pasek stanu nakłada się na elementy w mojej aplikacji, jak przycisk Wstecz mam w lewym górnym rogu mojej aplikacji. Swoją aplikację buduję za pomocą phonegap 2.9. Jakieś pomysły, Jak mogę to zrobić poprawnie.

splashscreen

UI

Author: Irfan, 2013-09-19

25 answers

Możesz rozwiązać ten problem, jeśli używasz storyboardów, jak w tym pytaniu: iOS 7 - pasek stanu nakłada się na widok

Jeśli nie używasz storyboardu, możesz użyć tego kodu w swoim AppDelegate.m w did finishlaunching:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
}

Zobacz także to pytanie: problem z paskiem stanu i paskiem nawigacji w IOS7

 66
Author: Romance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

W MainViewController.m inside: - (void)viewWillAppear:(BOOL)animated add this:

//Lower screen 20px on ios 7
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 18;
        viewBounds.size.height = viewBounds.size.height - 18;
        self.webView.frame = viewBounds;
    }

Więc funkcja końcowa będzie wyglądała tak:


- (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 = 18;
        viewBounds.size.height = viewBounds.size.height - 18;
        self.webView.frame = viewBounds;
    }
    [super viewWillAppear:animated];
}
 50
Author: Gimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 19:10:16

To, co zwykle robię, to dodawanie dwóch właściwości wartości klucza do pliku Info.plist.

Tutaj wpisz opis obrazka

Kod źródłowy właściwości to:

Tutaj wpisz opis obrazka

 36
Author: German Attanasio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 19:28:19

Mam problem z otwarciem przeglądarki inApp za pomocą phonegap. Poprawka Gimi działa dobrze, ale za każdym razem, gdy otwierałem przeglądarkę inApp, ekran był kurczony na dole. Dodałem więc instrukcję if, aby sprawdzić, czy pochodzenie y webview wynosi 0. Przeglądarka inApp nie ma już y origin 0, więc rozwiązała mój problem.

// ios 7 status bar fix
- (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) {
        if(self.webView.frame.origin.y == 0) {
            CGRect viewBounds = [self.webView bounds];
            viewBounds.origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }
    }

    [super viewWillAppear:animated];
}

Rozwiązanie nie jest naprawdę moje, ale nie mogę znaleźć źródła. Mam nadzieję, że to pomoże!

 9
Author: Zane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 10:51:43

Umieść ten fragment kodu w swoim pliku MainViewController.m w projekcie phonegap.

- (void)viewDidLayoutSubviews{

    if ([self respondsToSelector:@selector(topLayoutGuide)]) // iOS 7 or above
    {
        CGFloat top = self.topLayoutGuide.length;
        if(self.webView.frame.origin.y == 0){
            // We only want to do this once, or 
            // if the view has somehow been "restored" by other    code.
            self.webView.frame = CGRectMake(self.webView.frame.origin.x,
                                           self.webView.frame.origin.y + top,
                                           self.webView.frame.size.width,
                                           self.webView.frame.size.height-top);
        } 
    } 
}
 6
Author: Moeez Akram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 10:01:43

Używam tego kodu w metodzie ViewDidLoad.

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
 {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }

Działa to również podczas próby obsługi poprzednich wersji iOS.

 5
Author: jnawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 09:19:41

Właściwie, znalazłem odpowiedź Gimi za najlepszą odpowiedź, i szukałem dużo! Aby dodać do odpowiedzi Gimi, a także odpowiedzieć ignacio-munizaga na tę odpowiedź, kod będzie wykonywany za każdym razem, gdy pojawi się widok, co oznacza, że po zamknięciu wbudowanej przeglądarki, lub po rolce aparatu itp. więc po prostu umieścić wartość bool stwierdzając, czy rozmiar został już dostosowany.

Końcowy kod wygląda następująco:

bool sizeWasAdjusted = false;
- (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 (!sizeWasAdjusted && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 18;
        viewBounds.size.height = viewBounds.size.height - 18;
        self.webView.frame = viewBounds;
        sizeWasAdjusted = true;
    }
    [super viewWillAppear:animated];
}
 5
Author: trueicecold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 08:51:32

Spróbuj wejść do pliku (app name)-Info.plist aplikacji w XCode i dodaj klucz

view controller-based status bar appearance: NO
status bar is initially hidden : YES
To chyba działa dla mnie bez problemu.
 5
Author: dk123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 09:05:26

Jeśli twój rozwój dla iOS 7 nie polecam owijania paska stanu w czarny prostokąt stary styl iOS. Po prostu Zintegruj go z projektem, aby uzyskać bardziej" pełnoekranowy " wygląd iOS 7.

Możesz użyć tej wtyczki, aby dostosować kolor atramentu paska stanu, lub ukryć go lub pokazać w dowolnym momencie aplikacji.

Https://github.com/jota-v/cordova-ios-statusbar

Metody js to:

window.plugins.statusBar.hide();
window.plugins.statusBar.show();
window.plugins.statusBar.blackTint();
window.plugins.statusBar.whiteTint();

Ważne: również w pliku plist aplikacji Ustawić UIViewControllerBasedStatusBarAppearance aby NIE .

 5
Author: jotav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 08:09:44

Lepiej mieć to w info.plist

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

To sprawia, że w ogóle nie ma paska stanu.

 4
Author: kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 10:25:54

Aby rozwiązać problem paska stanu iOS7, możemy użyć następującego kodu do Cordova / PhoneGap:

function onDeviceReady() {
    if (parseFloat(window.device.version) === 7.0) {
          document.body.style.marginTop = "20px";
    }
}

document.addEventListener('deviceready', onDeviceReady, false);

W każdym razie Cordova 3.1 wkrótce naprawić, że to i inne problemy dla iOS7.

 3
Author: Franc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 08:54:21
 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

        self.window.clipsToBounds =YES;
[application setStatusBarStyle:UIStatusBarStyleLightContent];
 self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    }
 3
Author: Akshay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 12:19:52

From Apple iOS7 transition Guide ,

W szczególności,

self.automaticallyAdjustsScrollViewInsets = YES;
self.edgesForExtendedLayout = UIRectEdgeNone;

Działa dla mnie, gdy nie chcę się nakładać i mam UITableViewController.

 3
Author: Liangjun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 15:23:37

Jeśli używasz Cordova z Sencha Touch i używasz normalnego Sencha Touch nawigacja / paski tytułu, można po prostu rozciągnąć navbar I zmienić położenie zawartości w navbar tak wygląda w domu na iOS 7. Po prostu dodaj to do app.js (po ostatniej linii Ext.Viewport.add):

// Adjust toolbar height when running in iOS to fit with new iOS 7 style
if (Ext.os.is.iOS && Ext.os.version.major >= 7) {
  Ext.select(".x-toolbar").applyStyles("height: 62px; padding-top: 15px;");
}

(Źródło: http://lostentropy.com/2013/09/22/ios-7-status-bar-fix-for-sencha-touch-apps/)

Wiem, że to trochę nieciekawe, ale oszczędza radzenie sobie z tym na poziomie Objective-C. Nie będzie wiele dobrego dla tych, którzy nie używają Sencha Touch Z Cordova, choć.
 2
Author: Aaron B. Russell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 16:11:53

Wpisz następujący kod wewnątrz AppDelegate.m in didFinishLaunchingWithOptions event (dokładnie przed ostatnią linijką kodu " return YES;" ) :

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
    [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}
Czekam na Wasze opinie! :)
 2
Author: Ehsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 13:42:08

W .właściwość plist file set:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Ukrywa pasek stanu.

 2
Author: asmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 08:13:14

Najlepszym rozwiązaniem jest zmiana rozmiaru głównego widoku, szczególnie jeśli aplikacja używa stopki.

Na MainViewController.m przy użyciu metody viewDidLoad, po [super viewDidLoad];

NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[vComp objectAtIndex:0] intValue] >= 7) {
    // iOS 7 or above
    CGRect oldBounds = [self.view bounds];
    CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 );
    CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 );

    [self.view setBounds:newViewBounds];
    [self.webView setBounds:newWebViewBounds];
}

Wtedy nie będziesz musiał modyfikować żadnego javascript do swojej aplikacji

 1
Author: luster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 14:31:14

Wraz z wydaniem iOS 7.0.4, poprawka iOS7 zepsuła się w moim obecnym projekcie, ponieważ 7.0.4 działa bez poprawki. Dodano więc kontrolkę minor, aby po prostu ją uruchomić, jeśli działa minor release 3 lub mniej.

NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[vComp objectAtIndex:0] intValue] == 7 && [[vComp objectAtIndex:1] intValue] == 0 && [[vComp      objectAtIndex:2] intValue] <= 3 ) {
    CGRect oldBounds = [self.view bounds];
    CGRect newViewBounds = CGRectMake( 0, -10, oldBounds.size.width, oldBounds.size.height-20 );
    CGRect newWebViewBounds = CGRectMake( 0, -20, oldBounds.size.width, oldBounds.size.height-40 );
    [self.view setBounds:newViewBounds];
    [self.webView setBounds:newWebViewBounds];
}
 1
Author: oskarsprima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 13:53:46

Zacząłem podążać tą trasą, ale mam własną kontrolę nawigacji z core view, którą wsuwam do ramki, która zwykle owija rdzeń wspólnym paskiem tytułu i tabbar; nie storyboard, nie UINavigationController.

Szybko zaczęło się to komplikować, dodając i odejmując 20 pikseli paska stanu. Potem objawienie.

Zrobiłem kopię .xib file, powiedziałem Xcode, aby pokazać mi go jako układ iOS 7, wyrównałem wszystko i umieściłem pojedynczy przełącznik 6/7 w kodzie .. wszystko działa natychmiast racja, a dodatkowe zasoby dodają tylko 8K do zestawu.

 1
Author: Chris Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 08:18:24

Możemy to również sprawdzić w naszych plikach js

if (parseFloat(window.device.version) >= 7.0) {

    $("body").addClass("ios7");
}

W .plik css definiuje klasę dla tego

 .ios7 .ui-page, .ios7 .ui-header, .ios7 .ui-pane {
     margin-top: 17px !important;
  }
 1
Author: user3085992,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-14 04:19:21

Najpierw rozwijam dla iOS7, ale aby zachować kompatybilność z iOS6 robię dokładnie odwrotnie niż sugerował Gimi-w MainViewController.m ustawiam y origin 20px w górę i zwiększam wysokość widoku o 20px:

//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;
}
 0
Author: Dan Schien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 14:42:11

Wielkie dzięki, stary. Działa dobrze na:

MAC OS X 10.9.1 - Xcode 5.0.2 - cordova 3.3 - jQuery mobile 1.3.2.

 0
Author: Joaquin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 08:13:18

Oto moje podejście do CSS i Javascript:

1) Zdefiniuj następujące elementy w CSS:

#ios7-statusbar-fix {
    width:100%;
    height:20px;
    background-color:white;
    position:fixed;
    z-index:10000;
    margin-top:-20px;
    display:none;
}

2) Dodaj div-container o tym id jako pierwszy element po <body> - tag:

<body>
    <div id="ios7-statusbar-fix"></div>
…

3) Filtruj Urządzenia z systemem iOS 7 i stosuj zmiany za pomocą Javascript:

if (navigator.userAgent.match(/(iPad.*|iPhone.*|iPod.*);.*CPU.*OS 7_\d/i)) {
        document.body.style.marginTop = '20px';
        document.getElementById('ios7-statusbar-fix').style.display = 'block';
}
 0
Author: capitannaranja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 17:22:44

Niektóre z powyższych odpowiedzi dadzą ci czarny pasek na górze, jeśli ustawisz ekran związany 20px, inne będą zmniejszać ekran widoku sieci Web, jeśli używasz widoku sieci Web.rama.rozmiar.height-20px; Spróbuj tego, działa na każdym ios i nie musisz zmieniać css, włóż do środka

- (void)webViewDidFinishLoad:(UIWebView*)theWebView {

/ / is it IOS7 and up

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

/ / Pobierz rozmiar ekranu urządzenia

    CGRect screenBounds = [[UIScreen mainScreen] bounds];

//zmniejsz wysokość o 20px

    int x= screenBounds.size.height -20;

/ / ustaw webview top pos 20px tak, aby znajdował się pod paskiem stanu i zmniejsz rozmiar by 20px

    [theWebView setFrame:CGRectMake(0, 20, theWebView.frame.size.width, x )];

}
 0
Author: Mytee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 22:44:51

Dla iPhoneX

Dla wszystkich powyższych odpowiedzi:

Wysokość paska stanu w iPhoneX jest 44 a nie 20

 0
Author: Musa almatri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 15:56:18