iOS 7 - Durum çubuğu görünümle çakışıyor


109

Bir var ViewControllerbir iç olan UINavigationcontroller, ancak NavigationBar gizlenir. Uygulamayı iOS 7'de çalıştırdığımda, görünümümün üst kısmında durum çubuğu görünüyor. Bundan sakınmanın bir yolu var mı?

İşletim sistemine özel herhangi bir kod yazmak istemiyorum.

Buraya resim açıklamasını girin

Ben ayarlama çalıştı View controller-based status bar appearanceetmek NO, ancak sorunu çözmedi.


Cevabımı iOS 7'de iOS 6 gibi durum çubuğunu göstermek için yayınladım stackoverflow.com/questions/18294872/…
Desert Rose

2
Durum çubuğu sorununu
çözmek

Yanıtlar:


95

Xcode 5, iOS 6/7 Deltasbu sorunu çözmek için özel olarak yapılmıştır. Film şeridinde, iOS 7'ye tam olarak bakmak için görünümlerimi 20 piksel aşağı taşıdım ve iOS 6 uyumlu hale getirmek Delta yiçin -20 olarak değiştirdim .

görüntü açıklamasını buraya girin

Film şeridim otomatik düzen kullanmadığından, iOS 6'da görünümlerin yüksekliğini düzgün şekilde yeniden boyutlandırmak için Delta heightde ayarlamam gerekiyordu Delta Y.


8
Cevabınız doğru ancak 4 "ekranla çalışmıyor. 4" ekran için de çalışacaksa lütfen yanıtınızı güncelleyin. Şimdiden teşekkürler.

2
@AnkitMehta 4 "iPhone için özel bir şey yapmak zorunda
değildim

5
benim için çalıştı. Bu deltaları görmek için, film şeridi için 'Kimlik ve Tür' altında 'Otomatik Düzen Kullan' seçimini kaldırmanız gerektiğine dikkat edin.
marsant

2
∆Y için -20 belirlemenin yanı sıra, +20'yi ∆Height olarak ayarlamam gerektiğini öğrendim
Toland Hon

3
Durum çubuğu yüksekliği değiştiğinde ne olur? F.ex .: kullanıcı sıcak noktayı, vb. Etkinleştirdiğinde yükseklik 40 pikseldir ...
Lukasz

69

Sadece herhangi bir durum çubuğu İSTEMİYORSANIZ, plistinizi bu verilerle güncellemeniz gerekir: Bunu yapmak için, pliste şu 2 ayarı ekleyin:

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

İOS 7'de, uygulamanızı üst üste yerleştirilmiş şeffaf bir durum çubuğuyla tasarlamanız beklenir. Örneğin yeni iOS 7 Hava Durumu uygulamasına bakın.


3
Bu aslında tek iyi cevaptır, çünkü sorunu özünde yapılması gerektiği gibi düzeltir. Yani: olumlu oylar gerekli!
onbir59

5
Bazı durumlar için uygun olabilir, ancak durum çubuğunu gizlerken çok dikkatli olmak istersiniz. Yalnızca medya oynatıcılar veya görüntü izleyiciler gibi haklı olarak tam ekran olan görünümler için.
smileBot

1
@ eleven59, Apple'daki otokratların niyet ettiği yolu kastediyorsunuz.
JohnK

1
Bu kesinlikle bir görünüm denetleyicisinin ofsetini değiştirmekten daha iyidir (ki bu gerçekten kirli hissettirir).
Benjamin Umman

durum çubuğunu gizlemek iyi bir fikir değil ... Bunun iOS 7'yi kullanmanın en kolay yolu olduğunu biliyorum, ancak zamanlama GEREKLİ ...
Fahim Parkar

43

Bu, UIViewControlleriOS 7 için varsayılan davranıştır . Görünüm tam ekran olacaktır, bu da durum çubuğunun görünümünüzün üst kısmını kaplayacağı anlamına gelir.

Bir UIViewControlleriçinde bir alanınız varsa UINavigationControllerve navigationBar görünür durumdaysa, aşağıdaki kodu kullanabilirsiniz viewDidLoadveya navigationBar için bir arka plan resminiz olabilir.

self.edgesForExtendedLayout = UIRectEdgeNone;

NavigasyonBar'ı gizlediyseniz, 20 noktayı kaydırarak tüm UIView öğelerini ayarlamanız gerekir. Başka bir çözüm göremiyorum. Otomatik düzeni kullanmak biraz yardımcı olacaktır.

Geriye dönük uyumluluk istiyorsanız, iOS sürümünü algılamak için örnek kod.

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}

18
Sistem sürümünü getirmek, ayrıştırmak ve karşılaştırmak yerine kullanılması tavsiye edilirif ([self respondsToSelector:@selector(edgesForExtendedLayout)])
Sebastian Hojas

15

Kendi kendime yaptığım tek çalışan çözüm.

İşte UIViewController alt sınıfım https://github.com/comonitos/ios7_overlaping

UIViewController'dan 1 Alt Sınıf

2 window.rootViewController öğenizi o sınıftan alt sınıflara ayırın.

3 Voila!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4 Durum çubuğunuzu beyaz yapmak için [self.window makeKeyAndVisible] 'dan hemen sonra bunu ekleyin; !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

ama bu üstteki zamanı göstermiyor ... En büyük dezavantaj ... :(
Fahim Parkar

Harika çalışıyor, ancak 4. adım için, setStatusBarStyle kullanımdan kaldırıldığından ve varsayılan eylem hiçbir şey yapmamak olduğundan, görünüm denetleyicinizde PreferStatusBarStyle'ı kullanmalısınız. stackoverflow.com/a/19014724/1192732
CpnCrunch

13
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

Pliste Anahtar Ekle --- Denetleyici tabanlı durum çubuğu görünümünü görüntüle: HAYIR


gerekirse pencere rengini değiştirin
Darshit Shah

Teşekkürler, örtüşen sorunumu çözdü. Ancak bir sorun hala var - Denetleyici tabanlı durum çubuğu görünümünü görüntüleyin: HAYIR, sanırım durum çubuğunu gizlemek. Ama bunu EVET olarak ayarladığımda, durum çubuğunu göstermiyor ve HAYIR olarak ayarladığımda durum çubuğunu gösteriyor. Öyleyse lütfen söyle bana kavramla yanlış mıyım yoksa ne?
Nayan

1
Sanırım, didFinishLaunchingWithOptions 'self.window.backgroundColor = [UIColor blueColor]' da varsayılan yarı saydam renk kümesini aldığınız için; ' ve
plist'te ayarla

Güzel, teşekkürler! Ayrıca, Apple dokümanlarının if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} else {} ile kontrol edilmesini önerdiğini belirtmek için. Şerefe!
Joel Balmer

Çok teşekkür ederim.Kodunuz bizim için çok yararlı.Lütfen viewWillLayoutSubviews işlevi hakkında açıklama yapmanız gerekir.
user3182143

4

İos7'de durum çubuğunu gizlemek için şu basit adımları izleyin:

Xcode'da " Resources" klasörüne gidin ve " " dosyasını açın (app name)-Info.plist file.

  • " View controller based status bar appearance" anahtarını kontrol edin ve değerini ayarlayın " NO"
  • " Status bar is initially hidden" anahtarını kontrol edin ve değerini ayarlayın " YES"

Anahtarlar orada değilse information property list, üstteki " " öğesini seçerek ve + simgesini tıklayarak ekleyebilirsiniz.


Soruyu açıkça okuyun, durum çubuğunun tamamen gizlenmesini istemedi.
ShayanK

1
@AspersionCast: "Bundan kaçınmanın bir yolu var mı?" Diye sordu. ve bu, bundan kaçınmanın yollarından biridir.
Mandeep Pasbola


3

xibS kullanılıyorsa , çok kolay bir uygulama, tüm alt görünümleri yeniden boyutlandırma bayraklarıyla (zaten 3.5 "ve 4" uyumluluğu için kullanacaksınız) bir konteyner görünümünde kapsüllemek ve böylece görünüm hiyerarşisinin böyle görünmesini sağlamaktır.

xib hiyerarşisi

ve sonra şöyle bir viewDidLoadşey yapın:

- (void)viewDidLoad
{
  [super viewDidLoad];
  // initializations
  if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
  {
    CGRect frame = containerView.frame;
    frame.origin.y += 20;
    frame.size.height -= 20;
    containerView.frame = frame;
  }
}

Bu şekilde, uçların iOS 7 uyumluluğu için değiştirilmesi gerekmez. Bir arka planınız varsa, dışarıda tutulabilir containerViewve tüm ekranı kaplamasına izin verilebilir .


3

Durum çubuğunu kaldırmak için gereken tek şey budur. görüntü açıklamasını buraya girin


2

Gezinme Çubuğu için:

Bu kodu yazarken:

self.navigationController.navigationBar.translucent = NO;

sadece benim için hile yaptım.


1

Vincent'ın edgeForExtendedLayout cevabı benim için çalıştı.

Bu makrolar işletim sistemi sürümünü belirlemede yardımcı olur ve kolaylaştırır

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

bu makroları projenizin prefix.pch dosyasına ekleyin ve her yerden erişilebilir

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}

1
benim için self.edgesForExtendedLayout = UIRectEdgeNone; çalışmıyor ... herhangi bir nedenle neden?
Fahim Parkar


0

"Otomatik Düzen Kullan" ın herhangi bir maliyetle etkinleştirilmesini istiyorsanız, aşağıdaki kodu viewdidload'a yerleştirin.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

0

YTPlayer'ın yatay görünümünden döndükten sonra durum çubuğum ve gezinme çubuğum çakışıyor. İşte @comonitos'un sürümünü denedikten sonra benim çözümüm, ancak iOS 8'imde çalışmıyor

- (void)fixNavigationBarPosition {
    if (self.navigationController) {
        CGRect frame = self.navigationController.navigationBar.frame;
        if (frame.origin.y != 20.f) {
            frame.origin.y = 20.f;
            self.navigationController.navigationBar.frame = frame;
        }
    }
}

Gezinme çubuğunun konumunu her düzeltmek istediğinizde bu işlevi çağırmanız yeterlidir. YTPlayerViewDelegate'sini aradımplayerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
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.