Programlı olarak iOS durum çubuğu yüksekliği nasıl alınır?


277

Şu anda iPhone / iPad'in üstündeki durum çubuğunun (zaman, pil ve ağ bağlantısı ile) retina olmayan ekranlar için 20 piksel ve retina ekranlar için 40 piksel olduğunu biliyorum, ancak ileride kanıtlamak için uygulamamı istiyorum bunu sabit kodlama değerleri olmadan belirleyebilme. Durum çubuğunun yüksekliğini programlı olarak bulmak mümkün müdür?

Yanıtlar:


506

[UIApplication sharedApplication].statusBarFrame.size.height. Ancak tüm boyutlar piksel cinsinden değil, punto olduğundan, durum çubuğu yüksekliği her zaman 20'ye eşittir.

Güncelleme. Bu cevabın yararlı olduğunu düşündüğümde, ayrıntılı olarak düşünmeliyim.

Durum çubuğu yüksekliği aslında, aşağıdaki durumlar dışında 20.0f noktasına eşittir :

  • durum çubuğu setStatusBarHidden:withAnimation:yöntemle gizlendi ve yüksekliği 0,0f puana eşit;
  • @Burada belirtildiği gibi, Telefon uygulaması dışında gelen bir çağrı sırasında veya ses kaydı sırasında oturum durum çubuğu yüksekliği 40.0f puana eşittir.

Ayrıca görünümünüzün yüksekliğini etkileyen bir durum çubuğu da vardır. Normalde, görünümün yüksekliği, verilen yön eksi durum çubuğu yüksekliği için ekran boyutuna eşittir. Ancak, eğer animasyon durum çubuğu (göstermek veya gizlemek o) görünümü gösterilmiştir sonra, durum çubuğu çerçevesini değişecek, ancak görünüm olmaz , el durum çubuğu animasyon sonraki görünümünü yeniden boyutlandırmak gerekir (veya beri animasyonu sırasında durum çubuğu yüksekliği, animasyonun başlangıcında son değere ayarlanır).

Güncelleme 2. Ayrıca kullanıcı arayüzü yönlendirme durumu da vardır. Durum çubuğu yönlendirme değerine uymaz, bu nedenle portre modu için durum çubuğu yükseklik değeri [UIApplication sharedApplication].statusBarFrame.size.height(evet, uygulama bilgisi.plistiniz ne derse desin varsayılan yönlendirme her zaman dikeydir), manzara için - [UIApplication sharedApplication].statusBarFrame.size.width. UI'nın dışında UIViewControllerve self.interfaceOrientationkullanılabilir olmadığında geçerli yönünü belirlemek için kullanın [UIApplication sharedApplication].statusBarOrientation.

İOS7 için güncelleme. Durum çubuğu görsel stili değişse de, hala orada, çerçevesi hala aynı şekilde davranıyor. Durum çubuğu hakkında tek ilginç bulmak aldığım - Ben payını: senin UINavigationBar's kiremitli bazı ilginç tasarım etkileri elde ya da sadece durum çubuğunu renklendirebilirsiniz böylece arka plan da, durum çubuğuna kiremitli edilecektir. Bu da durum çubuğu yüksekliğini hiçbir şekilde etkilemez.

Gezinme çubuğu döşemeli arka planı da durum çubuğuna döşenir


6
Bu yöntem 1024 (iOS7)
Marc

1
@MarcMosby, güncellememe bakın. Bu sorunu hatırladım - teşekkürler.
Kyr Dunenkoff

2
Evet, Marc'ın iOS7'de işaret ettiği gibi bazen 1024 bazen 20 yaşında. Yani bu artık yüksekliği belirlemenin aptalca bir yolu değil. Bunun iOS 7'deki durum çubuğunun şeffaf yapısı nedeniyle olduğundan şüpheliyim, önce tam ekrana gider ve daha sonra kendini yeniden boyutlandırır. Bu nedenle, bu geçiş sırasında sorgular uygularsanız yanlış değer elde edebilirsiniz. Gecikme ile bu yöntemi çağırıyor olabilir iOS 7'de yardımcı olabilir.
Deepak GM

1
Durum çubuğu yüksekliğinin sıfır olabileceği bir durum vardır. UIInterfaceOrientationMask ve bir viewcontroller yerine UIInterfaceOrientation (yanlış sonuç ancak derleyici hatası yok) döndürülürse ve bir viewcontroller sunulur ve çıkarılırsa, durum çubuğu yüksekliği sıfır olur.
Cymric

5
Ayrıca iPhone X durum çubuğu daha yüksek olacaktır.
öncesi

98

İle gidin soruya Martin'in öneri: iPhone Durum Çubuğu Yükseklik alın .

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

Ve Swift'te

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

Bir saldırı gibi görünüyor, ama aslında oldukça sağlam. Her neyse, bu tek çalışan çözüm.

Eski Cevap

Özel alt sınıfınızda yer alan aşağıdaki kod, UIViewControllerneredeyse manzarayı desteklemek için çalıştı. Ancak, işe yaramadığı bir köşe kasasını (sağdan> desteklenmeyen baş aşağı> solda) fark ettim (anahtarlamalı yükseklik ve genişlik).

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

Bu doğru değil. Cihazı döndürdüğünüzde durum çubuğunun yüksekliği değişmez. Genişlik olurdu, ancak yukarıdaki kod bunu göstermiyor, orijinal soru da bu değildi.
lehn0058

1
"Cihazı döndürdüğünüzde durum çubuğunun yüksekliğinin değişmediği" haklısınız. Ancak Ash'in dediği gibi , "manzara modunda, genişlik ve yüksekliğin değiştiğini görebilirsiniz." Yukarıdaki kod bunu dikkate alır.
ma11hew28

Bu benim de gördüğüm ilginç bir konu. Apple tarafında bana bir hata gibi görünüyor, ancak yine de dikkate alınması gerekiyor.
lehn0058

2
@ lehn0058 Bu bir hata değil, Apple'ın çubuğu dahili olarak nasıl ele aldığı. Bir pencereye tutturulur ve bu pencere bir dönüşüm kullanılarak döndürülür. statusBarFrameDönüşümünden önce değeri olarak döndürülür.
Leo Natan

1
Bir tesis olarak daha iyi görünüyor: Dvar statusBarHeight: CGFloat
Pablo A.

23

Bunu dene:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

1
farklı yönlerde döndürülen yükseklik farklıdır. that strange
tGilani

1
Evet, döndürme yatay ise [[UIApplication sharedApplication] statusBarFrame] .size.height ve [[UIApplication sharedApplication] statusBarFrame] .size.width değerleri değiştirilir.
Guntis Treulands

21

Swift 3 veya Swift 4:

UIApplication.shared.statusBarFrame.height

10

Durum çubuğu genellikle 20pt uzunluğunda olsa da, bazı durumlarda bu miktarın iki katı olabilir:

  • bir telefon görüşmesinin ortasında olduğunuzda (bu oldukça yaygın bir senaryodur);
  • ses kaydedici veya Skype veya benzer bir uygulama mikrofonu arka planda kullanıyorsa;
  • Kişisel Erişim Noktası etkinleştirildiğinde;

Sadece deneyin ve kendiniz göreceksiniz. Yüksekliği 20pt olarak kodlamak genellikle çalışmaz.

H2CO3'ün cevabını ikinci olarak verdim:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

10

DÜZENLEME iOS görünümünüzü içeriğinin üst koymak için nereye çalışmalarına 11 yolu UIView en olduğunu safeAreaLayoutGuideBkz UIView Belgeler .

DEPRECATED CEVAP iOS 7+'yi hedefliyorsanız, UIViewController belgeleri, viewController topLayoutGuideözelliğinin size durum çubuğunun altını veya görünürse gezinme çubuğunun altını vermesini önerir . Bu yararlı olabilir ve önceki çözümlerin çoğundan kesinlikle daha az hack'tir.


5

Durum çubuğunun çerçevesinin ekranın koordinat alanında olacağını unutmayın! Yatay modda başlatırsanız, genişlik ve yüksekliğin değiştiğini görebilirsiniz. Yatay yönlendirmeleri destekliyorsanız, kodun bu sürümünü kullanmanızı kesinlikle öneririz:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

Daha sonra statusBarFrame'in height özelliğini doğrudan okuyabilirsiniz. Bu durumda 'Görünüm', büyük olasılıkla uygulama penceresinin kök görünüm denetleyicisi olan ölçümlerden yararlanmak istediğiniz görünüm olmalıdır.

Bu arada, telefon görüşmeleri sırasında durum çubuğu yalnızca daha uzun olabilir, aynı zamanda durum çubuğu kasıtlı olarak gizlenmişse de sıfır olabilir.


Bu bana doğru yüksekliği vermedi. Ancak, benim için işe
yarayan

Evet, bu oldukça eski bir kod şimdi muhtemelen geçerli bir cevap değil. Şahsen, otomatik düzen sayesinde durum çubuğunun yüksekliğini kontrol etmeye artık ihtiyacım yok.
Ash


2

İOS 13 için şunları kullanabilirsiniz:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

1
    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }


0

Durum çubuğu yüksekliğine doğrudan erişmenize izin vermeyen, ancak hesapladığınız bir yol buldum.

Gezinme Çubuğu yüksekliği - topLayoutGuide uzunluğu = durum çubuğu yüksekliği

Swift:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.lengthyarı saydam çubuğun kapsadığı üst alandır ve self.navigationController?.navigationBar.frame.heightgenellikle 44pt olan durum çubuğu hariç yarı saydam çubuktur. Bu nedenle, bu yöntemi kullanarak, telefon görüşmeleri nedeniyle durum çubuğu yükseklik değişikliği hakkında endişelenmeden durum çubuğu yüksekliğini kolayca hesaplayabilirsiniz.


Bu işe yaramaz, self.topLayoutGuide.length0 olur, bu nedenle sonuç -44 olur.
nambatee

@nambatee Artık işe yaramadığına inanıyorum çünkü iOS 11 Apple güvenli kullanım kullanıyorAreaInsets
Henry Ngan


-6

Aşağıdaki tek satır kodunu kullanarak durum çubuğu yüksekliğini herhangi bir yönde ve görünür veya görünmüyorsa alabilirsiniz

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

Sadece basit ama çok kullanışlı bir makro sadece bunu deneyin, herhangi bir ekstra kod yazmanıza gerek yok

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.