iPhone uygulamasında iOS 7 durum çubuğu iOS 6 varsayılan stiline geri dönüyor mu?


292

İOS 7'de bu UIStatusBar, görünümle şu şekilde birleşecek şekilde tasarlanmıştır:

Tina Tavčar tarafından tasarlanan GUI ( Tina Tavčar tarafından tasarlanan GUI )

  • Harika, ancak görünümünüzün üst kısmında bir şey olduğunda görünümünüzü biraz bozar ve durum çubuğu ile çakışır.

  • Çalışma şeklini [üst üste binmemek] iOS6'da olduğu gibi değiştirebilecek basit bir çözüm var mı (info.plist'de bir özellik ayarlamak gibi)?

  • Daha basit bir çözümün self.view.center.xher bir görüntü denetleyicisi için + 20 noktaya sahip olduğunu biliyorum , ancak bunları değiştirmek diğer boyutları self.view.center.xdaraltacaktır (farklı bir özelliğe sahip olmak, özel seguelerde sorun yaratabilir, vb.) Ve aniden sıkıcı bir işe dönüşür. kaçınılması en iyisidir.

  • Birisi bana bunun için tek katmanlı bir çözüm sağlayabilirse çok sevinirim.

PS: Durum çubuğunu,

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

Gelen didFinishLaunchingWithOptionsbir gerçek çözüm olduğunu düşünmüyoruz böylece yöntemle, ama bu geçici bir çözüm, sorunu önleme bir kısayol, bu.


6
Maalesef siyah durum çubukları ios 7'de kullanımdan kaldırıldı
i_duhh_bomb

@GangstaGraham ile aynı fikirdeyim. Bu renkler çok güzel ! Sorunuzu cevaplamak için korkarım ki yapamazsınız. Durum çubuğunun şu şekilde tasarlanmasının nedeni, yarı saydamlığın yeni iOS öğesi olması ve bir şeyin üstünde bir şey olduğunu söyleyerek bir uygulamaya "derinlik" vermek için tasarlanmış olmasıdır, bu nedenle altında bir şey vardır.
Cole Johnson

Tercih edilen durumBarStyle'ı UIStatusBarDefault olarak ayarlamayı denediniz mi? Ödeme iOS 7 UIViewController Belgeleri
theaob

1
UIStatusBarDefaultDurum çubuğuna sahip olmak , içeriğini yalnızca siyah renkte yapar. Bu, iOS6'da nasıl çalıştığına geri dönmeyecektir.
吖 奇 说 - 何魏奇 Archy

2
Bunda şans var mı? İOS7'yi seviyorum ama bu şey beni deli ediyor!
Mihai Fratu

Yanıtlar:


449

Bu, yazdığım bir blog yayınından çapraz olarak yayınlandı , ancak burada iOS 7'deki durum çubukları, gezinme çubukları ve konteyner görünümü denetleyicilerinin tam özeti:

  1. İOS 6 stili durum çubuğu düzenini korumanın bir yolu yoktur. Durum çubuğu her zaman iOS 7'deki uygulamanızla çakışır

  2. Durum çubuğu görünümünü durum çubuğu düzeniyle karıştırmayın. Görünüm (açık veya varsayılan) durum çubuğunun nasıl düzenlendiğini etkilemez (çerçeve / yükseklik / çakışma). Sistem durum çubuğunun artık arka plan renginin olmadığını da belirtmek önemlidir. API, UIStatusBarStyleLightContent'i ifade ettiğinde, açık bir arka plan üzerinde beyaz metin anlamına gelir. UIStatusBarStyleDefault açık bir arka plan üzerinde siyah metindir.

  3. Durum çubuğu görünümü, birbirini dışlayan iki temel yoldan biri boyunca denetlenir: bunları geleneksel olarak programlı olarak ayarlayabilirsiniz veya UIKit, UIViewController'ın bazı yeni özelliklerine dayalı olarak görünümü sizin için güncelleştirir. İkinci seçenek varsayılan olarak açıktır. Hangisini kullandığınızı görmek için uygulamanızın plist değerini “ViewController Tabanlı Durum Çubuğu Görünümü” için kontrol edin. Bu değeri EVET olarak ayarlarsanız, uygulamanızdaki her üst düzey görünüm denetleyicisinin (standart bir UIKit kapsayıcı görünüm denetleyicisi dışında), varsayılanı veya ışık stilini döndürerek, tercih edilen DurumBarStyle'yi geçersiz kılması gerekir. Plist değerini NO olarak düzenlerseniz, bilinen UIA uygulama yöntemlerini kullanarak durum çubuğu görünümünü yönetebilirsiniz.

  4. UINavigationController, oldukça garip ve belgelenmemiş bir kısıtlama kümesine bağlı olarak UINavigationBar'ın yüksekliğini 44 nokta veya 64 nokta olarak değiştirir. UINavigationController, görünümünün çerçevesinin üst kısmının UIWindow'un üstü ile görsel olarak bitişik olduğunu tespit ederse, gezinme çubuğunu 64 nokta yüksekliğinde çizer. Görünümünün üstü UIWindow'un üstü ile bitişik değilse (sadece bir nokta kapalı olsa bile), gezinme çubuğunu 44 nokta yüksekliğiyle “geleneksel” şekilde çizer. Bu mantık, uygulamanızın görünüm denetleyicisi hiyerarşisinde birkaç çocuk olsa bile UINavigationController tarafından gerçekleştirilir. Bu davranışı önlemenin bir yolu yoktur.

  5. Yalnızca 44 punto (88 piksel) uzunluğunda özel bir gezinme çubuğu arka plan görüntüsü sağlarsanız ve UINavigationController görünümünün sınırları UIWindow'un sınırlarıyla (# 4'te tartışıldığı gibi) eşleşirse, UINavigationController görüntünüzü çerçeveye çizer (0,20,320) , 44), özel resminizin üzerinde 20 puan opak siyah alan bırakarak. Bu, # 1 kuralını atlayan akıllı bir geliştirici olduğunuzu düşünmeniz konusunda sizi şaşırtabilir, ancak yanılıyorsunuz. Gezinme çubuğu hala 64 puan yüksekliğinde. UINavigationController'ı slayttan ortaya çıkacak bir stil görünüm hiyerarşisine gömmek bunu oldukça açık hale getirir.

  6. UIViewController'ın kafa karıştırıcı olarak adlandırılmış edgeForExtendedLayout özelliğine dikkat edin. EdgeForExtendedLayout öğesinin ayarlanması çoğu durumda hiçbir şey yapmaz. UIKit'in bu özelliği kullanmasının tek yolu, bir UINavigationController öğesine bir görünüm denetleyicisi eklerseniz, UINavigationController alt görünüm denetleyicisinin gezinme çubuğu / durum çubuğu alanının altında görünüp görünmeyeceğini belirlemek için edgeForExtendedLayout öğesini kullanır. UINavigationController'ın kendi kenarlarını ayarlamak için UINavigationController'ın 44 veya 64 noktalı yüksek gezinme çubuğu alanına sahip olup olmadığını değiştirmek için hiçbir şey yapmaz. Bu mantık için # 4'e bakın. Bir araç çubuğu veya UITabBarController kullanılırken benzer düzen mantığı görünümünüzün alt kısmı için de geçerlidir.

  7. Yapmaya çalıştığınız tek şey, özel alt görünüm denetleyicinizin UINavigationController'ın içindeyken gezinme çubuğunun altını çizmesini önlemekse, edgeForExtendedLayout öğesini UIRectEdgeNone (veya en azından UIRectEdgeTop'u hariç tutan bir maske) olarak ayarlayın. Bu değeri, görünüm denetleyicinizin yaşam döngüsünde mümkün olduğunca erken ayarlayın.

  8. UINavigationController ve UITabBarController ayrıca alt görünüm hiyerarşisinde tablo görünümleri ve koleksiyon görünümlerinin contentInsset öğelerini doldurmaya çalışacaktır. Bunu, # 4'teki durum çubuğu mantığına benzer bir şekilde yapar. Tablo görünümleriniz ve koleksiyon görünümleriniz için otomatik olarak ADJustsScrollViewInsets öğesini NO olarak ayarlayarak bunu önlemenin programlı bir yolu vardır (varsayılan olarak EVET'dir). Bu, araç çubuğu ve klavye hareketlerine yanıt olarak tablo görünümlerinin düzenini kontrol etmek için contentInset ayarlamalarını kullandığımız için Whisper ve Riposte için bazı ciddi sorunlar yarattı.

  9. Tekrarlamak gerekirse: iOS 6 stil durum çubuğu düzen mantığına dönmenin bir yolu yoktur. Buna yaklaşmak için, uygulamanızın tüm görünüm denetleyicilerini ekranın üst kısmından 20 nokta ötelenen bir konteyner görünümüne taşımanız ve eski görünümü simüle etmek için durum çubuğunun arkasında kasıtlı olarak siyah bir görünüm bırakmanız gerekir. Riposte ve Whisper'da kullandığımız yöntem budur.

  10. Apple # 9 yapmaya çalışmadığınızdan emin olmak için çok zorluyor. Durum çubuğunun altını çizmek için tüm uygulamalarımızı yeniden tasarlamamızı istiyorlar. Bununla birlikte, hem kullanıcı deneyimi hem de teknik nedenlerden dolayı, bunun neden her zaman iyi bir fikir olmadığı birçok cogent argümanı vardır. Kullanıcılarınız için en iyisini yapmalı ve sadece platformun hevesini takip etmemelisiniz.


35
Üst görünüm kılavuzuna eklenecek görünümünüzün üst kısmına herhangi bir kısıtlama ekleyebileceğinizi eklemek istedim - bu durum çubuğunun arkasında boş bir alan bırakacaktır (istediğiniz rengi doldurabilirsiniz) ancak görünümün iOS 6'da da otomatik olarak doğru konuma ayarlanmasına izin verir. Bu şekilde, görünümlerinizin koddaki konumunu manuel olarak ayarlamak zorunda kalmazsınız.
BreadicalMD

4
Bu harika bir çözüm. AutoLayout'ta cehaletimi gösterdiniz. Bunu yapsan iyi olur.
jaredsinclair

1
Nesnenizin üst alanını üst düzen kılavuzunun kenarının altına yerleştirirseniz, şimdi en üst düzen kılavuzu olacak olan en yakın komşuya dikey bir boşluk kısıtlaması eklemek için kısıtlama denetimini kullanabilirsiniz. Alternatif olarak, açıkça bir dikey boşluk kısıtlaması eklemek için nesnenizden üst düzen kılavuzuna ctrl + click tuşlarını kullanabilirsiniz.
BreadicalMD

2
@BreadicalMD Anlamadığım bir bölüm -topLayoutGuide'ın iOS 6'da mevcut olmaması, bu yüzden iOS 7 ve 6'da farklı Otomatik Düzen kısıtlamaları kullanmanız gerektiği anlamına mı geliyor?
Jeremy

1
Harika cevap ... Ama bir şüphe var 1) UINavigationController yükseklik kısmını değiştirerek.Lütfen biraz daha açıklayın. teşekkürler
user1010819

122

19 Eylül 2013 Güncellemeleri:

ekleyerek sabit ölçekleme hataları self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

düzeltilmiştir yazım hataları NSNotificationCenteraçıklamada


12 Eylül 2013 Güncellemeleri:

düzeltilmiş UIViewControllerBasedStatusBarAppearanceiçinNO

ekran döndürmeli uygulamalar için bir çözüm ekledi

durum çubuğunun arka plan rengini değiştirmek için bir yaklaşım eklendi.


Görünüşe göre, iOS7 durum çubuğunu iOS6'da nasıl çalıştığına geri döndürmenin bir yolu yok.

Ancak, her zaman bazı kodlar yazabilir ve durum çubuğunu iOS6 benzeri hale getirebiliriz ve bu en kısa yoludur:

  1. Set UIViewControllerBasedStatusBarAppearanceiçin NOde info.plist(görünüm kontrolörleri biz UIApplicationstatusBarStyle yöntemini kullanarak durum çubuğu stilini ayarlayabilirsiniz böylece durum çubuğu stilini ayarlamak zorunda iptal etmek için.)

  2. AppDelegate'lerde application:didFinishLaunchingWithOptionsarayın

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    


amacıyla:

  1. İOS 7 olup olmadığını kontrol edin.

  2. Durum çubuğunun içeriğini UIStatusBarStyleDefault'un aksine beyaz olarak ayarlayın.

  3. Çerçeveleri görünür sınırların ötesine uzanan alt görünümlerden kaçının (ana görünüme yukarıdan canlanan görünümler için).

  4. Durum penceresinin, uygulamanın pencere çerçevesini değiştirip yeniden boyutlandırarak iOS 6'daki gibi yer kapladığı yanılsamasını yaratın.


Ekran döndürme özelliğine sahip uygulamalar için,

ekleyerek yön değişikliklerini tespit etmek için NSNotificationCenter'ı kullanın

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

içinde if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)ve AppDelegate içinde yeni bir yöntem oluşturun:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
    int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
    int w = [[UIScreen mainScreen] bounds].size.width;
    int h = [[UIScreen mainScreen] bounds].size.height;
    switch(a){
        case 4:
            self.window.frame =  CGRectMake(0,20,w,h);
            break;
        case 3:
            self.window.frame =  CGRectMake(-20,0,w-20,h+20);
            break;
        case 2:
            self.window.frame =  CGRectMake(0,-20,w,h);
            break;
        case 1:
           self.window.frame =  CGRectMake(20,0,w-20,h+20);
    }
}

Böylece yönelim değiştiğinde, uygulamanın ekran yönünü (Dikey, Baş Aşağı, Yatay Sola veya Yatay Sağa) tespit etmek ve sırasıyla iOS 6 durum çubuğu yanılsaması oluşturmak için uygulamanın pencere çerçevesini değiştirmek için bir anahtar ifadesi tetikler.


Durum çubuğunuzun arka plan rengini değiştirmek için:

Ekle

 @property (retain, nonatomic) UIWindow *background;

içinde AppDelegate.holmak backgroundsizin sınıfta bir özellik ve ayırmayı kaldırma gelen ARC engeller. (ARC kullanmıyorsanız bunu yapmanız gerekmez.)

Bundan sonra sadece UIWindow'u oluşturmanız gerekir if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1):

background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

@synthesize background;Sonra unutmayın @implementation AppDelegate!


3
Bu rotasyona son verir. sadece bir kafa kadar
Jesse Naugher

2
@JesseNaugher Dikey Aralık Kısıtlamasını programdan 0 ile 20 arasında değiştirmenizi öneririm. Rotasyon üzerinde çalışacaktır.
uzman

2
Gezinme çubuğunun 20 piksel genişlediğinden nasıl kaçınabileceğimiz hakkında bir fikrin var mı? Bu çözüm benim için iyi ancak gezinme çubuğum 20 piksel çok yüksek.
simonbs

4
@ArchyHolt: Basit bir çözüm denetleyici sunmam dışında basit çözümünüz benim için çalışıyor. Kalıcı görünüm denetleyicisi kapatıldığında, kalan görünüm artık durum çubuğunun altındadır. Devam eden başka bir şey olmadığından emin olmak için bunu yeni bir örnek projede yeniden ürettim. Belki de daha gelişmiş çözümün burada yararlı olabileceğini düşünüyorum, ancak hangi bildirimin yürürlüğe gireceğinden emin değilim. Herhangi bir fikir?
markdorison

4
Bir modsal görünüm denetleyicisini kapattıktan sonra görünüm sıfırlanır. :(
KarenAnne

41

GÜNCELLEME (YENİ ÇÖZÜM)

Bu güncelleme iOS 7 gezinme çubuğu sorununun en iyi çözümüdür. Gezinme çubuğu renk örneğini ayarlayabilirsiniz: FakeNavBar.backgroundColor = [UIColor redColor];

Not: Varsayılan Gezinti Denetleyicisini kullanıyorsanız, lütfen eski çözümü kullanın.

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = [UIColor whiteColor];

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }

    return YES;

}

ESKİ ÇÖZÜM - Önceki kodu kullanırsanız, lütfen aşağıdaki Kod ve Resmi dikkate almayın

Bu, iOS 7 gezinme çubuğu çözümünün eski sürümüdür.

Aşağıdaki kodla sorunu çözdüm. Bu bir durum çubuğu eklemek içindir. didFinishLaunchingWithOptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    UIView *addStatusBar = [[UIView alloc] init];
    addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
}

Ve Interface Builder için bu, iOS 6 ile açtığınızda içindir; 0 pikselden başlıyor.

Not: iOS 6/7 Delta'ları yalnızca ayrıntılar bölmesindeki "Dosya Denetçisi" (en soldaki simge) içindeki Görünüm Denetleyicisi için "Otomatik Yerleşimi Kullan" seçeneğinin işaretini kaldırırsanız görünür.

Resim açıklamasını buraya girin


6
Günümü sen yaptın. Yardım için +1 al!
Niru Mukund Shah

5
Lütfen dikkat: iOS 6/7 Delta'ları yalnızca ayrıntılar bölmesindeki "Dosya Denetçisi" (en soldaki simge) içindeki Görünüm Denetleyicisi için "Otomatik Yerleşimi Kullan" seçeneğinin işaretini kaldırırsanız görünür.
Matt

1
Çok teşekkürler! Beni çok fazla beladan kurtardın!
neowinston

2
İOS 6 stil durum çubuğu düzeninin sürdürülemeyeceğini kim söyledi, Bunu @ TacettinÖzbölük yolu ile yapabilirsiniz ... Bu awsum çözümü için teşekkürler dostum.
Vizllx

1
güzel bir! ayrıca, şimdi elma şimdi bunu tercih not: if (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
Joel Balmer

26

ÇÖZÜM :

Yöntemi geçersiz kılarak görünüm denetleyicinizde veya rootviewcontroller'da ayarlayın:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

Kötü bir çözüm değil. Çubuğu tamamen çıkarın. UX için her zaman ideal olmayabilir, ancak uygulanabilir.
Farhan Hafeez

Sadece harika. Kusursuzca benim için çalıştı.
madLokesh

Senaryo: Videoyu tam ekran oynattıktan sonra UIVIew'e geri döndüğümde, altta yalnızca durum çubuğunun boyutu olan siyah bir çubuk görünüyor, ancak zaten bir durum çubuğu kullanıyordum. Durum çubuğunu tamamen kaldırdım ve şimdi sorun düzeltildi.
madLokesh

Ben sadece bu yöntemi kullanarak başarılı oldum
user2277872

17

İşte Storyboard'u kapsamlı bir şekilde kullanan projeler için başka bir yaklaşım:

HEDEF:

Bu yaklaşımın amacı, iOS7'de iOS6'da olduğu gibi aynı durum çubuğu stilini yeniden oluşturmaktır ("iOS 7 Durum Çubuğu iOS 6 stiline geri dönilsin mi?" Soru başlığına bakın).

ÖZET:

Bunu başarmak için, iOS 6.1 veya önceki sürümlerde aşağı doğru düzen değişikliğini geri döndürmek için deltaları kullanırken durum çubuğuyla çakışan UI öğelerini (iOS 7 altında) aşağı doğru kaydırarak Storyboard'u mümkün olduğunca kullanıyoruz. İOS 7'de ortaya çıkan ekstra alan daha sonra backgroundColor bizim seçtiğimiz bir renge ayarlanmış bir UIView tarafından işgal edilir. İkincisi kodda veya Storyboard kullanılarak oluşturulabilir (aşağıdaki ALTERNATİFLER'e bakın)

VARSAYIMLARI:

Aşağıdaki adımları uygularken istenen sonucu elde etmek için, View controller-based status bar appearanceHAYIR olarak Status bar styleayarlandığı ve "Saydam siyah stil (0,5 alfa)" veya "Opak siyah stil" olarak ayarlandığı varsayılır . Her iki ayar da proje ayarlarınızda "Bilgi" altında bulunabilir / veya eklenebilir.

ADIMLAR:

  • Durum çubuğu arka planınız olarak hizmet vermek için UIWindow'a bir alt görünüm ekleyin. Bunu başarmak için, AppDelegate en almak için şunları da eklemek application: didFinishLaunchingWithOptions:sonrasÖmakeKeyAndVisible

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • SADECE iOS 7 için programlı bir arka plan eklediğinizden, iOS6 için düzenlerini korurken durum çubuğuyla çakışan UI öğelerinizin düzenini buna göre ayarlamanız gerekir. Bunu başarmak için aşağıdakileri yapın:

    • Use AutolayoutStoryboard'unuz için işaretlenmediğinden emin olun (bunun nedeni, aksi takdirde Boyut Denetçisinde "iOS 6/7 Deltas" gösterilmemesidir). Bunu yapmak için:
      • Storyboard dosyanızı seçin
      • Yardımcı Programları göster
      • "Dosya Denetçisini Göster" i seçin
      • "Arayüz Oluşturucu Belgesi" altında "Otomatik Yerleşimi Kullan" seçeneğinin işaretini kaldırın
    • İsteğe bağlı olarak, uygularken hem iOS 7 hem de 6 için düzen değişikliklerini izlemenize yardımcı olmak için "Yardımcı Editör" ü seçin, "Önizleme" ve "iOS 6.1 veya daha eski bir sürümü seçin": resim açıklamasını buraya girin resim açıklamasını buraya girin
    • Şimdi ayarlamak istediğiniz kullanıcı arayüzü öğesini seçin, böylece artık durum çubuğu ile çakışmaz
    • Yardımcı Programlar sütununda "Boyut Denetçisini Göster" i seçin
    • UI öğenizi durum çubuğu bg yüksekliği ile aynı miktarda Y ekseni boyunca yeniden konumlandırın: resim açıklamasını buraya girin
    • Ve Y için iOS6 / 7 Deltas değerini, durum çubuğu bg yüksekliği ile aynı NEGATİF miktarla değiştirin (kullanıyorsanız, iOS 6 önizlemesindeki değişikliği not edin): resim açıklamasını buraya girin

ALTERNATİFLERİ:

Film şeridinde yoğun projelere daha da az kod eklemek ve durum çubuğu arka planını otomatik olarak döndürmek için durum çubuğunuza programlı bir arka plan eklemek yerine, söz konusu görünüm denetleyicisinin ana görünümünün en üstünde yer alan her görünüm denetleyicisine renkli bir görünüm ekleyebilirsiniz. Daha sonra bu yeni görünümün yükseklik deltasını, görünümünüzün yüksekliği ile aynı negatif miktara değiştirirsiniz (iOS 6 altında kaybolması için).

Bu alternatifin dezavantajı (otomatik döndürme uyumluluğu göz önüne alındığında belki de önemsiz olsa da), iOS 6 için Storyboard'unuzu görüntülüyorsanız bu ekstra görünümün hemen görünmemesi gerçeğidir. Storyboard'un Belge Anahattı ".


12

Eğer görünüm kontrolörleri durum çubuğunda (ve gezinti çubukları) tarafından üst üste olmak istemiyorsanız, kutuyu "Üst Barlar altında Kenarları genişlet" işaretini kaldırın Interface Builder içinde Xcode 5.

Üst Çubukların Altındaki Kenarları Uzat'ın işaretini kaldırın


7
Bu sadece bir storyboard kullanıyorsanız mümkündür
Cœur

3
Yalnızca gezinti denetleyicisi veya sekme denetleyicisi gibi kapsayıcılar vcs ile çalışır
Andrea

2
EdgeForExtendedLayout, yalnızca konteyner görünüm denetleyicileri (UINavigationController gibi) tarafından, çocuk görünümlerinin üst öğenin kromuyla çakışması gerekip gerekmediğini belirlemek için kullanılır. Bu özelliği UIWindow için kök görünüm denetleyicisinde ayarlamak hiçbir şey yapmaz. Yukarıdaki cevabımı gör: stackoverflow.com/questions/18294872/…
jaredsinclair

Bir UITabBarController @Andrea için nasıl yapıyorsunuz? Teşekkürler.
KarenAnne

@KarenAnne Programlı olarak veya film şeridi ile yaptığınıza göre değişir. Programlı olarak, yalnızca edgeForExtent özelliğini UITabBarViewController içinde gösterdiğiniz görünüm denetleyicisinde istediğiniz gibi ayarlamanız gerekir, ancak durum çubuğunda sorun yaşamamak için UITabbarController'ın içine bir uinavigationcontroller yüklemeniz gerekir. Burayı kontrol et. developer.apple.com/library/ios/documentation/UserExperience/…
Andrea

11

Apple Teknik Soru ve Cevapları QA1797: Durum Çubuğunun Görüşlerinizi Kaplamasını Önleme . İOS 6 ve iOS 7 sürümleri için iyi çalışıyor.


5
Apple herkesin otomatik düzen kullandığını varsayıyor. Otomatik düzen Xcode 4'te korkunçtu ve Xcode 5 henüz piyasaya sürüldü, bu yüzden bu şüpheli bir varsayım.
Glenn Maynard

1
Ancak, bu daha iyi bir çözümdür sonra kök pencerenin veya durum çubuğunun çerçevesini yeniden boyutlandırın.
Igor

Anlayabildiğim kadarıyla, rootViewController bir splitViewController ise Apple'ın çözümü çalışmıyor.
Vern Jensen

8

Bu lanet sorunu gidermek için pek çok çok ve çok sayıda öğretici izledim. Ama hiçbiri çalışmıyor! İşte benim çözümüm ve benim için çalışıyor:

if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
    float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
    for( UIView *v in [self.view subviews] ) {
        CGRect rect = v.frame;
        rect.origin.y += statusBarHeight;
        v.frame = rect;
    }
}

Mantık basit. Ben 20 piksel ile kendi görünümümde tüm çocukların görüşlerini kaydırıyorum. Bu kadar. Ardından, ekran görüntüsü tıpkı iOS 6'daki gibi görüntülenecektir. İOS7 durum çubuğundan nefret ediyorum! ~ "~


2
bunu nereye eklemeliyim? uygulama delegesi seçenekleri ile başlattı?
mhmdshawqi

Bunu yaptığımda durum çubuğum beyaza dönüyor
ropo

6

Archy Holt'un cevabına küçük bir alternatif, biraz daha basit:

a. Set UIViewControllerBasedStatusBarAppearanceiçin NOInfo.plist içinde

b. In AppDelegates' application:didFinishLaunchingWithOptions:, çağrı:

if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
    // handling statusBar (iOS7)
    application.statusBarStyle = UIStatusBarStyleLightContent;
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.window.clipsToBounds = YES;

    // handling screen rotations for statusBar (iOS7)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

Ve yöntemi ekleyin:

- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
    // handling statusBar (iOS7)
    self.window.frame = [UIScreen mainScreen].applicationFrame;
}

Ayrıca alt sınıflamayı kendi başlarına UIWindowele almayı düşünebilirsiniz UIApplicationDidChangeStatusBarOrientationNotification.


presentViewController: animated: completion:? ile ilgili bir sorununuz mu var?
Tùng Đỗ

@ TùngĐỗ doğru, bu yüzden daha iyi çalışan bir alternatif yaptım: stackoverflow.com/questions/18294872/…
Cœur

5

Bunu tüm görünüm denetleyicilerimde kullandım, çok basit. Bu satırları tüm viewDidLoad yöntemlerinize ekleyin:

- (void)viewDidLoad{
    //add this 2 lines:
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super viewDidLoad];
}

1
Bir cazibe gibi çalıştı ve kolay ölü. Ruby hareketinde, süper kullanıma çağrıdan önce: self.edgesForExtendedLayout = UIRectEdgeNone yanıt verirse TOSelector ("edgeForExtendedLayout")
profesör 7:13

4

Bu basit yöntemi deneyin ....

Adım 1 : Tekli olarak değiştirmek içinviewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Adım 2 : Tüm uygulamada değişiklik yapmak için

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

Adım 3 : Yüksekliğini viewWillAppearayarlamak statusbariçin her birine ekleyiniOS7

    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
        CGRect frame = [UIScreen mainScreen].bounds;
        frame.origin.y+=20.0;
        frame.size.height-= 20.0;
        self.view.frame = frame;
        [self.view layoutIfNeeded];
    }


3

İOS 7'de iOS 6 gibi durum çubuğuna ulaştım.

İnfo.plist içinde UIViewControllerBasedStatusBarAppearance öğesini NO olarak ayarlayın

Bu kodu - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsyöntemde temel alın

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);

    //Added on 19th Sep 2013
    NSLog(@"%f",self.window.frame.size.height);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

Bu kod aşağıdaki kullanımının gelip üzerinde 20 pixels.To bütün görüşlerinizi aşağı itebilir -(void)viewDidAppear:(BOOL)animatedyöntemle

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    CGRect frame=self.view.frame;
    if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
    {
        frame.size.height-=20;
    }
    self.view.frame=frame;
}

DidFinishLauncing Yönteminde pencere ayırmadan sonra windowHeight Userdefaults değerini aşağıdaki gibi ayarlamanız gerekir:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];

Daha iyi bir yaklaşım, UINavigationBar'ınızı height44 yerine 64'e eşit yapmaktır. Ardından çubuğunuz Apple'ın uygulamalarında olduğu gibi en üste kadar uzanacaktır.
Aaron Brager

@AaronBrager Ama benim gereksinimim iOS 6 stil durum çubuğunu göstermekti.
Desert Rose

Lütfen Yatay Yönlendirme iOS 7 için çözüm ekleyebilir misiniz? Ben de aynı şeyi yapıyorum. ancak iOS 7 Landscape uygulamasında çalışmıyor.
sathiamoorthy

@DesertRose THX! Bu benim için işe yarıyor, ancak alttaki uitabbar'ı kesiyor. 2 tablo görünümü denetleyicileri olan 3 görünümleri, sekme çubuğu denetleyicisi tabanlı bir uygulama var.
marciokoko

1
Cihazı döndürene kadar (iOS 7 cihazım bir iPad), bu onu mükemmel bir şekilde düzeltir. Ama bir kez döndüğümde, siyah çubuk tam olarak olduğu yerde kalır ve "görünüm" (yanlış teknik terim ise üzgünüm, ben bir PhoneGap / web adamıyım) küçülmüş yüksekliğini korur - ancak artık yükseklik değil, genişlik. Bu çözüm döndürmeyi desteklemiyor, ancak gördüğüm en iyi düzeltme - cihaz dönüşlerini izlemek nasıl geliştirilebilir? Teşekkürler!
tylerl

2

Arayüz oluşturucu kullanıyorsanız, şunu deneyin:

Xib dosyanızda:

1) Ana görünümü seçin, arka plan rengini siyaha (veya durum çubuğunun olmasını istediğiniz renklere) ayarlayın

2) Arka planın, denetleyicinin görüşünün en üst düzey alt öğesi olarak konumlandırılmış bağımsız bir alt görünüm olduğundan emin olun.
Denetleyicinin görüşünün doğrudan alt öğesi olmak için arka planınızı hareket ettirin. Tüm çerçeve kenarlarını kilitlediğinizden, her iki esneklik eksenini etkinleştirdiğinizden emin olmak için otomatik boyutlandırma panelini kontrol edin ve bu bir UIImageView ise, içerik modunu Doldurmak için Ölçekle olarak ayarlayın. Programlı olarak bu, UIViewContentModeScaleToFill olarak ayarlanmış contentMode'a ve otomatik yeniden boyutlandırma maskesinin (UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight) olarak ayarlandığını gösterir.

3) Şimdi kilitli olan her şeyi 20 puan yukarı ve aşağı hareket ettirin ve iOS 6/7 delta Y'yi -20 olarak ayarlayın.
Otomatik boyutlandırma panelinde üst çerçeveye kilitlenen tüm üst düzey çocukların 20 puan aşağı kaydırılması ve iOS 6/7 delta Y değerinin -20 olarak ayarlanması gerekir. (Cmd hepsini seçin ve aşağı ok 20 kez tıklayın - daha iyi bir yolu var mı?)

4) Esnek bir yüksekliğe sahip yukarıdaki tüm öğelerin iOS 6/7 delta yüksekliğini ayarlayın. Çerçevenin üstüne ve altına kilitlenen ve otomatik boyutlandırma panelinde esnek yüksekliği etkinleştirilmiş öğelerin herhangi birinin iOS 6/7 delta yüksekliği 20 olarak ayarlanmış olmalıdır. Bu, yukarıda belirtilen arka plan görünümünü içerir. Bu sezgisel görünmeyebilir, ancak bunların uygulanma sırası nedeniyle gereklidir. Çerçeve yüksekliği önce ayarlanır (cihaza göre), daha sonra deltalar uygulanır ve son olarak otomatik boyutlandırma maskeleri, tüm alt çerçevelerin ofset konumlarına göre uygulanır - biraz düşünün, mantıklı olacaktır.

5) Son olarak, alt çerçeveye kilitlenmiş ancak üst çerçeveye kilitlenmemiş öğelerin deltaya ihtiyacı yoktur.

Bu size iOS7 ve iOS6'daki aynı durum çubuğunu verecektir.

Öte yandan, iOS6 uyumluluğunu korurken iOS7 stilini istiyorsanız , arka plan görünümü için delta Y / delta yükseklik değerlerini 0 olarak ayarlayın.

Daha fazla iOS7 taşıma bilgisi görmek için yayının tamamını okuyun: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


Otomatik düzen kullanılırken delta yok
kayıp tercüme

2

Benim çözümüm, UIViewiOS 7'de pencerenin üstüne 20 punto yüksekliğinde bir eklemekti . Sonra AppDelegate sınıfımda "katı" durum çubuğu arka planını göstermek / gizlemek için bir yöntem oluşturdum. İçinde application:didFinishLaunchingWithOptions::

// ...

// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];

// ...
return YES;

Sonra siyah durum çubuğu arka planını içeri / dışarı solmaya yönelik bir yöntem oluşturdum:

- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
    [UIView animateWithDuration:0.3f animations:^{
        if(solidStatusBar)
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            self.statusBarBackground.alpha = 1.0f;
        }
        else
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
            self.statusBarBackground.alpha = 0.0f;
        }
    }];
}

Şimdi tek yapmam [appDelegate showSolidStatusBar:YES]gereken çağrı gerektiğinde.


2

Otomatik düzeni kullanırsanız bu çok zor bir sorun olabilir çünkü kareleri artık doğrudan değiştiremezsiniz. Çok fazla iş yapmadan basit bir çözüm var.

Yardımcı Program Sınıfında bir yardımcı program yazma sona erdi ve tüm görünüm denetleyicilerinin viewDidLayoutSubviewsYöntem denir .

+ (void)addStatusBarIfiOS7:(UIViewController *)vc
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            CGRect viewFrame = vc.view.frame;
            if(viewFrame.origin.y == 20) {
                //If the view's y origin is already 20 then don't move it down.
                return;
            }
            viewFrame.origin.y+=20.0;
            viewFrame.size.height-= 20.0;
            vc.view.frame = viewFrame;
            [vc.view layoutIfNeeded];
        }
    }

viewDidLayoutSubviewsDurum çubuğunu istediğiniz görünüm denetleyicisinde yönteminizi geçersiz kılın . Sizi Autolayout'un yükünden geçirir.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}

1

Bunu yapmanın en kolay yolu, en yeni Xcode'unuza eski bir SDK yüklemek.

Eski SDK'yı en yeni Xcode'a nasıl kurabilirim?

  1. İOS 6.1 SDK'sını http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html adresinden veya daha eski bir Xcode'u indirerek ve SDK'yı içeriklerinden alarak alabilirsiniz

  2. Bu klasörü açın ve /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDK'lara yapıştırın

  3. Xcode'u yeniden başlatın.

  4. U şimdi projenizin oluşturma ayarlarında daha eski bir SDK seçebilir

Umarım size yardımcı olur. Benim için çalıştı =)


benim için çalıştı. teşekkürler @marcelosalloum ama yine de benim app gelecekteki güncellemesi için iOS7 şeffaf durum çubuğunu desteklemek için benim telefon boşluk (uiwebview) uygulaması için bir geçici çözüm arıyor. Tekrar teşekkürler. ;)
hanism

@marcellosaloum, uygulamanın Apple tarafından kabul edileceğinden emin misiniz? XCode 4 ile derlenen uygulamaların artık kabul edilmeyeceğini söylediler ... bu aslında iOS 6 SDK anlamına geliyor.
Valerio

Uygulamam gerçekten kabul edildi çünkü Xcode5 eski iOS SDK'larını derleyebilir. AppStore'un Xcode4 yerleşik uygulamalarını reddedip getirmeyeceğinden emin değilim, ancak (Xcode4! = İOS 6 SDK) dediğin gibi.
marcelosalloum

1 Şubat'tan sonra mıydı? O gün Apple bunu zorunlu kıldı.
Valerio

Hayır, geçen sene bu koda dokundu, halk. Apple'ın bunu zorunlu kıldığını bilmiyordum (bilmekten memnun değil). Lütfen buraya yazan bağlantıyı gönderir misiniz? Şerefe
marcelosalloum

1

Kullanarak şöyle presentViewController:animated:completion:berbat window.rootViewController.view, ben bu konuya farklı bir yaklaşım bulmak zorunda kaldı. Sonunda benim rootViewController UIView alt sınıflandırarak modals ve rotasyonlar ile çalışmak için aldım.

.h

@interface RootView : UIView

@end

.m

@implementation RootView

-(void)setFrame:(CGRect)frame
{
    if (self.superview && self.superview != self.window)
    {
        frame = self.superview.bounds;
        frame.origin.y += 20.f;
        frame.size.height -= 20.f;
    }
    else
    {
        frame = [UIScreen mainScreen].applicationFrame;
    }

    [super setFrame:frame];
}

- (void)layoutSubviews
{
    self.frame = self.frame;

    [super layoutSubviews];
}

@end

Artık iOS7 animasyonları için güçlü bir geçici çözümünüz var.


1

Bu cevaba geç kaldım, ama sadece yaptığım şeyi paylaşmak istiyorum, ki bu temel olarak en kolay çözüm

Her şeyden önce-> Dosyanıza gidin info.plistve Durum Çubuğu Stili ekleyin-> Şeffaf Siyah Stil (0,5 Alfa)

Şimdi, işte gidiyor: -

Bu kodu AppDelegate.m'inize ekleyin

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }

0

Benim çok basit çözümüm (yalnızca dikey yönlendirmenin desteklendiğini varsayarsak), Uygulama temsilcisinin didFinishLaunchingWithOptions yönteminde 7'nin altındaki iOS sürümleri için uygulama penceresi sınırlarını yeniden tanımlamaktır:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
    // handling statusBar (iOS6) by leaving top 20px for statusbar.
    screenBounds.origin.y = 20;
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}

Kodunuz 'y' değerini 0'dan 20'ye kaydırır, ancak yüksekliği buna göre ayarlamaz, bu nedenle screenBounds.size.height - = 20 eklemeniz gerekir. screenBounds.origin.y = 20'den hemen sonra;
Amit C.

0

Durum çubuğunu hep birlikte gizleyebilirsiniz. Böylece uygulamanız tam ekran olacaktır. Bence bu alacağın en iyisi.

UIStatusBarStyleNone veya hedef ayarlarında yapabilirsiniz.


2
UIStatusbarstylenone nerede belirtilir
user4951

0

Adımlar iOS 7'de durum çubuğunu gizleme:

1. uygulama info.plist dosyanıza gidin.

2.Ve Set, Görünüm denetleyicisi tabanlı durum çubuğu görünümü: Boolean NO

Umarım durum çubuğu sorununu çözdüm .....


0

SetStatusBarHidden ile çalışmaya devam etmek için: Bu kategoriyi kullanıyorum:

@interface UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;

@end

@implementation UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
    if (!IOS7) {
        [self setStatusBarHidden:statusBarHidden];
        return;
     }

    if ([self isStatusBarHidden] == statusBarHidden) {
        return;
    }

    [self setStatusBarHidden:statusBarHidden];
    [self keyWindow].clipsToBounds = YES;
    CGFloat offset = statusBarHidden ? 0 : 20;
    [self keyWindow].frame =  CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
    [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}

@end


0

Bu paylaşmak için çok geç olabilir, ama ben birine yardımcı olabilecek bir şey var, UINavigationBar alt sınıfta çalışıyordu ve siyah durum çubuğu ve beyaz durum çubuğu metni ile ios 6 gibi görünmesini istedim.

İşte bunun için çalışırken bulduğum şey

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

Durum çubuğu arka planımı siyah, durum çubuğu metni beyaz ve gezinme çubuğunun rengi beyaz yaptı.

iOS 9.3, XCode 7.3.1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.