Bilah status iOS 7 kembali ke gaya default iOS 6 di aplikasi iPhone?


292

Di iOS 7 UIStatusBartelah dirancang sedemikian rupa sehingga menyatu dengan tampilan seperti ini:

GUI dirancang oleh Tina Tavčar (GUI dirancang oleh Tina Tavčar )

  • Ini keren, tetapi itu akan agak mengacaukan pandangan Anda ketika Anda memiliki sesuatu di bagian atas tampilan Anda, dan itu menjadi tumpang tindih dengan bilah status.

  • Apakah ada solusi sederhana (seperti menyetel properti di info.plist) yang dapat mengubah cara kerjanya [tidak tumpang tindih] kembali seperti di iOS6?

  • Saya tahu solusi yang lebih mudah adalah memiliki self.view.center.x+ 20 poin untuk setiap pengontrol tampilan tunggal, tetapi mengubahnya akan mengacaukan dimensi lain (memiliki perbedaan self.view.center.xdapat menyebabkan masalah pada segmen kustom, dll.) Dan tiba-tiba berubah menjadi pekerjaan yang membosankan yaitu sebaiknya dihindari.

  • Saya akan sangat senang jika seseorang dapat memberikan saya solusi satu-liner untuk ini.

PS Saya tahu saya bisa menyembunyikan bilah status dengan melakukan hal-hal seperti memiliki

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

Dalam didFinishLaunchingWithOptionsmetode, tapi itu solusinya, jalan pintas menghindari masalah, jadi saya tidak menganggap itu solusi nyata.


6
Bar status hitam yang menyedihkan ditinggalkan di ios 7
i_duhh_bomb

Saya akan setuju dengan @GangstaGraham. Warna-warna itu sangat indah ! Untuk menjawab pertanyaan Anda, saya khawatir Anda tidak bisa. Alasan bilah status dirancang seperti itu sekarang adalah karena tembus adalah hal iOS baru dan dirancang untuk memberikan "kedalaman" untuk aplikasi dengan mengatakan itu di atas sesuatu, jadi ada sesuatu di bawahnya.
Cole Johnson

Sudahkah Anda mencoba mengatur preferStatusBarStyle ke UIStatusBarDefault? Checkout Dokumentasi UIViewController iOS 7
theaob

1
Memiliki UIStatusBarDefaultuntuk bilah status hanya membuat isinya berwarna hitam. Ini tidak akan membuat fungsinya kembali seperti di iOS6.
吖 奇 说 - 何魏奇 Archy Will He

2
Keberuntungan dengan ini? Saya suka iOS7 tetapi hal ini membuat saya gila!
Mihai Fratu

Jawaban:


449

Ini diposkan silang dari pos blog yang saya tulis , tetapi di sini adalah ikhtisar lengkap tentang bilah status, bilah navigasi, dan pengontrol tampilan wadah di iOS 7:

  1. Tidak ada cara untuk mempertahankan tata letak status bar gaya iOS 6. Bilah status akan selalu tumpang tindih dengan aplikasi Anda di iOS 7

  2. Jangan bingung tampilan bilah status dengan tata letak bilah status. Tampilan (terang atau standar) tidak memengaruhi bagaimana bilah status diletakkan (bingkai / tinggi / tumpang tindih). Penting untuk dicatat juga bahwa bilah status sistem tidak lagi memiliki warna latar belakang. Ketika API merujuk ke UIStatusBarStyleLightContent, artinya teks putih dengan latar belakang yang jelas. UIStatusBarStyleDefault adalah teks hitam dengan latar belakang yang jelas.

  3. Penampilan bilah status dikendalikan di sepanjang salah satu dari dua jalur basis yang saling eksklusif: Anda dapat mengaturnya secara terprogram secara tradisional, atau UIKit akan memperbarui penampilan untuk Anda berdasarkan pada beberapa properti baru UIViewController. Opsi terakhir diaktifkan secara default. Periksa nilai plist aplikasi Anda untuk "Tampilan Bilah Status Berbasis-ViewController" untuk melihat mana yang Anda gunakan. Jika Anda menyetel nilai ini ke YA, setiap pengontrol tampilan tingkat atas di aplikasi Anda (selain pengontrol tampilan wadah UIKit standar) perlu mengesampingkanStatusBarStyle yang disukai, mengembalikan standar atau gaya cahaya. Jika Anda mengedit nilai plist menjadi NO, maka Anda dapat mengelola tampilan bilah status menggunakan metode aplikasi UIA yang umum.

  4. UINavigationController akan mengubah ketinggian UINavigationBar-nya menjadi 44 poin atau 64 poin, tergantung pada serangkaian kendala yang agak aneh dan tidak berdokumen. Jika UINavigationController mendeteksi bahwa bagian atas bingkai tampilan secara visual bersebelahan dengan bagian atas UIWindow-nya, maka ia menggambar bilah navigasi dengan ketinggian 64 poin. Jika top view-nya tidak bersebelahan dengan top UIWindow (walaupun hanya dengan satu poin), maka ia menggambar bilah navigasinya dengan cara "tradisional" dengan ketinggian 44 poin. Logika ini dilakukan oleh UINavigationController bahkan jika beberapa anak di dalam hierarki pengontrol tampilan aplikasi Anda. Tidak ada cara untuk mencegah perilaku ini.

  5. Jika Anda memberikan gambar latar belakang bilah navigasi khusus yang tingginya hanya 44 poin (88 piksel), dan batas tampilan UINavigationController cocok dengan batas UIWindow (seperti dibahas dalam # 4), UINavigationController akan menggambar gambar Anda di dalam bingkai (0,20,320) , 44), menyisakan 20 titik ruang hitam buram di atas gambar khusus Anda. Ini mungkin membingungkan Anda untuk berpikir Anda adalah pengembang yang pintar yang mengabaikan aturan # 1, tetapi Anda salah. Bar navigasi masih 64 poin. Menanamkan UINavigationController dalam hierarki tampilan gaya slide-untuk-mengungkapkan membuat ini sangat jelas.

  6. Waspadai properti edgeForExtendedLayout yang dinamai membingungkan dari UIViewController. Menyesuaikan edgeForExtendedLayout tidak melakukan banyak hal dalam kebanyakan kasus. Satu-satunya cara UIKit menggunakan properti ini adalah jika Anda menambahkan view controller ke UINavigationController, maka UINavigationController menggunakan edgeForExtendedLayout untuk menentukan apakah pengontrol tampilan anak-nya harus terlihat di bawah bilah navigasi / area bilah status. Mengatur edgeForExtendedLayout pada UINavigationController sendiri tidak mengubah apa pun apakah UINavigationController memiliki area bilah navigasi 44 atau 64 titik. Lihat # 4 untuk logika itu. Logika tata letak serupa berlaku untuk bagian bawah tampilan Anda saat menggunakan bilah alat atau UITabBarController.

  7. Jika semua yang Anda coba lakukan adalah mencegah pengontrol tampilan anak kustom Anda dari tumpang tindih bar navigasi ketika di dalam UINavigationController, kemudian atur edgeForExtendedLayout ke UIRectEdgeNone (atau setidaknya topeng yang mengecualikan UIRectEdgeTop). Tetapkan nilai ini sedini mungkin dalam siklus hidup pengontrol tampilan Anda.

  8. UINavigationController dan UITabBarController juga akan mencoba untuk mengisi kontenInsets tampilan tabel dan pandangan koleksi dalam hierarki subview. Itu melakukan ini dengan cara yang mirip dengan logika status bar dari # 4. Ada cara terprogram untuk mencegah hal ini, dengan mengatur secara otomatisAdjustsScrollViewInsets ke TIDAK untuk tampilan tabel dan tampilan koleksi Anda (defaultnya adalah YA). Ini menimbulkan beberapa masalah serius bagi Whisper dan Riposte, karena kami menggunakan penyesuaian contentInset untuk mengontrol tata letak tampilan tabel sebagai respons terhadap pergerakan bilah alat dan keyboard.

  9. Untuk mengulangi: tidak ada cara untuk kembali ke logika tata letak status bar gaya iOS 6. Untuk memperkirakan ini, Anda harus memindahkan semua pengontrol tampilan aplikasi Anda ke tampilan wadah yang diimbangi oleh 20 poin dari bagian atas layar, meninggalkan tampilan hitam sengaja di belakang bilah status untuk mensimulasikan tampilan lama. Ini adalah metode yang kami gunakan di Riposte dan Whisper.

  10. Apple berusaha sangat keras untuk memastikan Anda tidak mencoba melakukan # 9. Mereka ingin kami mendesain ulang semua aplikasi kami untuk mendasari bar status. Ada banyak argumen yang meyakinkan, baik untuk pengalaman pengguna maupun alasan teknis, mengapa ini tidak selalu merupakan ide yang baik. Anda harus melakukan yang terbaik untuk pengguna Anda dan tidak hanya mengikuti imajinasi platform.


35
Hanya ingin menambahkan bahwa Anda dapat menambahkan batasan untuk apa pun yang ada di bagian atas tampilan Anda untuk dilampirkan ke panduan tata letak atas - ini akan meninggalkan ruang kosong di belakang bilah status (yang dapat Anda isi dengan warna apa pun yang Anda inginkan) tetapi juga akan memungkinkan tampilan untuk secara otomatis menyesuaikan ke posisi yang benar di iOS 6 juga. Dengan begitu Anda tidak perlu secara manual menyesuaikan posisi tampilan Anda dalam kode.
BreadicalMD

4
Itu solusi yang brilian. Anda telah mengungkap ketidaktahuan saya di AutoLayout. Lebih baik lakukan itu.
jaredsinclair

1
Jika Anda menempatkan ruang teratas objek di bawah tepi panduan tata letak teratas, Anda dapat menggunakan kontrol kendala untuk menambahkan batasan spasi vertikal ke tetangga terdekat, yang sekarang akan menjadi panduan tata letak teratas. Atau Anda dapat menggunakan ctrl + klik dari objek Anda ke panduan tata letak atas untuk menambahkan batasan spasi vertikal secara eksplisit.
BreadicalMD

2
@BreadicalMD Satu bagian yang saya tidak mengerti adalah -topLayoutGuide tidak tersedia di iOS 6, jadi apakah itu berarti Anda perlu menggunakan batasan Auto Layout yang berbeda pada iOS 7 dan 6?
Jeremy

1
Jawaban yang bagus ... Tapi saya punya satu keraguan 1) UINavigationController mengubah bagian ketinggian. Tolong jelaskan sedikit lagi. terima kasih
user1010819

122

Pembaruan pada 19 September 2013:

memperbaiki bug penskalaan dengan menambahkan self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

kesalahan ketik dikoreksi dalam NSNotificationCenterpernyataan


Pembaruan pada 12 September 2013:

dikoreksi UIViewControllerBasedStatusBarAppearancemenjadiNO

menambahkan solusi untuk aplikasi dengan rotasi layar

menambahkan pendekatan untuk mengubah warna latar belakang bilah status.


Tampaknya, tidak ada cara untuk mengembalikan status bar iOS7 kembali ke cara kerjanya di iOS6.

Namun, kami selalu dapat menulis beberapa kode dan mengubah bilah status menjadi seperti iOS6, dan ini adalah cara terpendek yang dapat saya lakukan:

  1. Diatur UIViewControllerBasedStatusBarAppearanceke NOdalam info.plist(Untuk memilih tidak memiliki pengontrol tampilan, sesuaikan gaya bilah status sehingga kami dapat mengatur gaya bilah status dengan menggunakan metode UIApplicationstatusBarStyle.)

  2. Di AppDelegate application:didFinishLaunchingWithOptions, panggil

    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;
    


untuk:

  1. Periksa apakah itu iOS 7.

  2. Setel konten bilah status menjadi putih, yang bertentangan dengan UIStatusBarStyleDefault.

  3. Hindari subview yang bingkainya melampaui batas yang terlihat (untuk tampilan yang bergerak ke tampilan utama dari atas).

  4. Buat ilusi bahwa bilah status membutuhkan ruang seperti di iOS 6 dengan menggeser dan mengubah ukuran bingkai jendela aplikasi.


Untuk aplikasi dengan rotasi layar,

gunakan NSNotificationCenter untuk mendeteksi perubahan orientasi dengan menambahkan

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

di if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)dan menciptakan metode baru dalam AppDelegate:

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

Sehingga ketika orientasi berubah, itu akan memicu pernyataan beralih untuk mendeteksi orientasi layar aplikasi (Portrait, Upside Down, Landscape Left, atau Landscape Right) masing-masing dan mengubah bingkai jendela aplikasi masing-masing untuk menciptakan ilusi bilah status iOS 6.


Untuk mengubah warna latar belakang bilah status Anda:

Menambahkan

 @property (retain, nonatomic) UIWindow *background;

di AppDelegate.huntuk membuat backgroundsebuah properti di kelas Anda dan mencegah ARC dari deallocating itu. (Anda tidak harus melakukannya jika Anda tidak menggunakan ARC.)

Setelah itu Anda hanya perlu membuat UIWindow di 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];

Jangan lupa untuk @synthesize background;setelah @implementation AppDelegate!


3
Ini rusak pada rotasi. just a head up
Jesse Naugher

2
@JesseNaugher Saya sarankan memodifikasi Batasan Spasi Vertikal dari 0 hingga 20 secara pemrograman. Ini akan bekerja pada rotasi.
ahli

2
Adakah gagasan tentang bagaimana kita dapat menghindari bahwa bilah navigasi bertambah 20 piksel? Solusi ini baik untuk saya tetapi bilah navigasi saya 20 piksel terlalu tinggi.
simonbs

4
@ArchyHolt: Solusi sederhana Anda berfungsi untuk saya kecuali ketika saya menyajikan pengontrol tampilan modal. Setelah pengontrol tampilan modal ditolak, tampilan yang tersisa sekarang berada di bawah bilah status. Saya telah mereproduksi ini dalam proyek sampel baru untuk memastikan tidak ada hal lain yang funky terjadi. Saya pikir mungkin solusi Anda yang lebih canggih bisa berguna di sini tetapi tidak yakin notifikasi apa yang akan dimainkan. Ada ide?
markdorison

4
Tampilan diatur ulang setelah mengabaikan pengontrol tampilan modal. :(
KarenAnne

41

UPDATE (SOLUSI BARU)

Pembaruan ini adalah solusi terbaik dari masalah bilah navigasi iOS 7. Anda dapat mengatur contoh warna bilah navigasi: FakeNavBar.backgroundColor = [UIColor redColor];

Catatan: Jika Anda menggunakan Pengontrol Navigasi default, gunakan solusi lama.

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;

}

SOLUSI LAMA - JIKA Anda menggunakan kode sebelumnya, silakan abaikan Kode dan Gambar berikut ini

Ini adalah versi lama dari solusi navigasi bar iOS 7.

Saya memecahkan masalah dengan kode berikut. Ini untuk menambahkan bilah status. 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];
}

Dan untuk Interface Builder ini untuk saat Anda membuka dengan iOS 6; mulai dari 0 piksel.

Catatan: iOS 6/7 Delta hanya muncul jika Anda hapus centang "Gunakan Autolayout" untuk View Controller di "File Inspector" (ikon paling kiri) di panel detail.

Masukkan deskripsi gambar di sini


6
Anda membuat hari saya. Ambil +1 untuk bantuan!
Niru Mukund Shah

5
Harap dicatat: iOS 6/7 Delta hanya muncul jika Anda menghapus centang "Gunakan Autolayout" untuk Pengontrol Tampilan di "File Inspector" (ikon paling kiri) di panel detail.
Matt

1
Terima kasih banyak! Anda menyelamatkan saya banyak masalah!
neowinston

2
Siapa bilang tata letak status bar gaya iOS 6 tidak dapat dipertahankan, Anda dapat melakukannya dengan cara @ TacettinÖzbölük ... terima kasih sobat untuk solusi awsum ini.
Vizllx

1
bagus juga, hanya untuk mencatat apel lebih suka ini sekarang: if (NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1) {}
Joel Balmer

26

SOLUSI:

Atur di viewcontroller Anda atau di rootviewcontroller dengan mengganti metode:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

Bukan solusi yang buruk. Hapus bilah sepenuhnya. Mungkin tidak ideal untuk UX sepanjang waktu tetapi bisa diterapkan.
Farhan Hafeez

Sungguh mengagumkan. Bekerja untuk saya dengan sempurna.
madLokesh

Skenario: Setelah saya kembali ke UIVIew setelah memutar video layar penuh, bilah hitam muncul di bagian bawah yang hanya seukuran bilah status, meskipun, saya sudah menggunakan bilah status. Saya menghapus bilah status sama sekali dan sekarang masalah sudah diperbaiki.
madLokesh

Saya hanya berhasil menggunakan metode ini
user2277872

17

Di sini pendekatan lain untuk proyek yang menggunakan Storyboard secara ekstensif:

TUJUAN:

Tujuan dari pendekatan ini adalah untuk membuat ulang gaya bilah status yang sama di iOS7 seperti yang ada di iOS6 (lihat judul pertanyaan "iOS 7 Bilah Status Kembali ke gaya iOS 6?").

RINGKASAN:

Untuk mencapai ini, kami menggunakan Storyboard sebanyak mungkin dengan menggeser elemen UI yang tumpang tindih dengan bilah status (di bawah iOS 7) ke bawah, sementara menggunakan delta untuk mengembalikan perubahan tata letak ke bawah untuk iOS 6.1 atau sebelumnya. Ruang ekstra yang dihasilkan di iOS 7 kemudian ditempati oleh UIView dengan backgroundColor diatur ke warna yang kita pilih. Yang terakhir dapat dibuat dalam kode atau menggunakan Storyboard (lihat ALTERNATIF di bawah ini)

ASUMSI:

Untuk mendapatkan hasil yang diinginkan ketika mengikuti langkah-langkah di bawah ini, diasumsikan bahwa View controller-based status bar appearancediatur ke TIDAK dan AndaStatus bar style diatur ke "Gaya hitam transparan (alfa 0,5)" atau "Gaya hitam buram". Kedua pengaturan dapat ditemukan / atau ditambahkan di bawah "Info" di pengaturan proyek Anda.

LANGKAH:

  • Tambahkan subview ke UIWindow untuk berfungsi sebagai latar belakang bilah status Anda. Untuk mencapai ini, tambahkan berikut ini ke AppDelegate Anda application: didFinishLaunchingWithOptions:setelahmakeKeyAndVisible

    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];
    }
    
  • Karena Anda secara terprogram menambahkan latar belakang untuk iOS 7 SAJA, Anda harus menyesuaikan tata letak elemen UI Anda yang tumpang tindih oleh bilah status sesuai dengan itu sambil mempertahankan tata letak mereka untuk iOS6. Untuk mencapai ini, lakukan hal berikut:

    • Memastikan bahwa Use Autolayout tidak dicentang untuk Storyboard Anda (ini karena jika tidak "iOS 6/7 Delta" tidak ditampilkan di Ukuran Inspektur). Untuk melakukan ini:
      • pilih file Storyboard Anda
      • tampilkan Utilities
      • pilih "Tampilkan File Inspektur"
      • Di bawah "Antarmuka Dokumen Pembuat" hapus centang "Gunakan Autolayout"
    • Secara opsional, untuk membantu Anda memantau perubahan tata letak untuk iOS 7 DAN 6 saat Anda menerapkannya, pilih "Asisten Editor", pilih "Pratinjau" dan "iOS 6.1 atau sebelumnya": masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini
    • Sekarang pilih elemen UI yang ingin Anda sesuaikan sehingga tidak tumpang tindih oleh bilah status lagi
    • Pilih "Tampilkan Inspektur Ukuran" di kolom Utilities
    • Ubah posisi elemen UI Anda di sepanjang sumbu Y dengan jumlah yang sama dengan tinggi statusbar bg: masukkan deskripsi gambar di sini
    • Dan ubah nilai iOS6 / 7 Delta untuk Y dengan jumlah NEGATIF ​​yang sama dengan tinggi status bg (Perhatikan perubahan dalam pratinjau iOS 6 jika Anda menggunakannya): masukkan deskripsi gambar di sini

ALTERNATIF:

Untuk menambahkan lebih sedikit kode dalam proyek storyboard-berat dan memiliki latar belakang statusbar autorotate, daripada menambahkan secara terprogram untuk statusbar Anda, Anda bisa menambahkan tampilan berwarna ke setiap pengontrol tampilan yang duduk di bagian paling atas dari tampilan utama viewcontroller tersebut. Anda kemudian akan mengubah delta ketinggian tampilan baru ini ke jumlah negatif yang sama dengan tinggi tampilan Anda (untuk membuatnya menghilang di bawah iOS 6).

Kelemahan dari alternatif ini (walaupun mungkin dapat diabaikan mengingat kompatibilitas autorotate) adalah kenyataan bahwa tampilan tambahan ini tidak segera terlihat jika Anda melihat Storyboard Anda untuk iOS 6. Anda hanya akan tahu bahwa itu ada di sana jika Anda melihat " Garis Besar Dokumen "dari Storyboard.


12

Jika Anda tidak ingin pengontrol tampilan Anda tumpang tindih oleh bilah status (dan bilah navigasi), hapus centang pada kotak "Perluas Tepi Di Bawah Bilah Atas" di Interface Builder di Xcode 5.

Hapus centang pada Perluas Tepian Di Bawah Bilah Atas


7
Ini hanya mungkin jika Anda menggunakan papan cerita
Cœur

3
Ini hanya berfungsi dengan kontainer vcs seperti pengontrol navigasi atau pengontrol tabbar
Andrea

2
edgeForExtendedLayout hanya digunakan oleh pengontrol tampilan wadah (seperti UINavigationController) untuk menentukan apakah pandangan anak-anak itu harus tumpang tindih oleh chrome induk. Mengatur properti ini pada pengontrol tampilan root untuk UIWindow tidak melakukan apa-apa. Lihat jawaban saya di atas: stackoverflow.com/questions/18294872/…
jaredsinclair

Bagaimana Anda melakukannya untuk UITabBarController @Andrea? Terima kasih.
KarenAnne

@ KarenAnne Tergantung jika Anda melakukan pemrograman atau dengan storyboard. Secara terprogram Anda hanya perlu mengatur properti edgeForExtent ke apa yang Anda suka di pengontrol tampilan yang Anda perlihatkan di dalam UITabBarViewController, tetapi untuk tidak memiliki masalah bilah status, Anda harus memuat uinavigationcontroller di dalam UITabbarController. Periksa di sini. developer.apple.com/library/ios/documentation/UserExperience/…
Andrea

11

Apple merilis Tanya Jawab Teknis QA1797: Mencegah Bilah Status dari Menutupi Pandangan Anda . Ini berfungsi dengan baik untuk versi iOS 6 dan iOS 7.


5
Apple berasumsi semua orang menggunakan tata-letak otomatis. Tata letak otomatis mengerikan di Xcode 4, dan Xcode 5 baru saja dirilis, jadi ini asumsi yang meragukan.
Glenn Maynard

1
Tetapi dalam prospek ini adalah solusi yang lebih baik daripada mengubah ukuran bingkai jendela root atau status bar.
Igor

Sejauh yang saya tahu, solusi Apple tidak berfungsi jika rootViewController Anda adalah splitViewController.
Vern Jensen

8

Saya telah melihat banyak banyak banyak dan banyak tutorial untuk memperbaiki masalah sialan ini. Tapi tidak satupun dari mereka yang bekerja! Inilah solusi saya, dan ini berfungsi untuk saya:

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

Logikanya sederhana. Saya menggeser semua tampilan anak di tampilan self.view dengan 20 piksel. Itu saja. Kemudian, tangkapan layar akan ditampilkan seperti yang dilakukan iOS 6. Saya benci status bar iOS7! ~ "~


2
di mana saya harus menambahkan ini? dalam delegasi aplikasi apakah diluncurkan dengan opsi?
mhmdshawqi

Ketika saya melakukan ini, status saya menjadi putih
ropo

6

Alternatif kecil untuk jawaban Archy Holt, sedikit lebih sederhana:

Sebuah. Diatur UIViewControllerBasedStatusBarAppearanceke NOdalam info.plist

b. Dalam AppDelegate's application:didFinishLaunchingWithOptions:, panggilan:

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];
}

Dan tambahkan metode:

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

Anda juga dapat mempertimbangkan subclass UIWindowuntuk menangani UIApplicationDidChangeStatusBarOrientationNotificationsendiri.


apakah Anda memiliki masalah dengan presentViewController: animated: completion:?
TĐỗng Đỗ

@ TĐỗngĐỗ benar, jadi saya membuat alternatif yang berfungsi lebih baik: stackoverflow.com/questions/18294872/…
Cœur

5

Saya menggunakan ini di semua pengontrol tampilan saya, itu sederhana. Tambahkan baris ini di semua metode viewDidLoad Anda:

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

    [super viewDidLoad];
}

1
Bekerja seperti mantra, dan mudah mati. Dalam gerakan ruby, sebelum panggilan untuk menggunakan super: self.edgesForExtendedLayout = UIRectEdgeNone jika respondToSelector ("edgeForExtendedLayout")
tehprofessor

4

Coba metode sederhana ini ....

Langkah 1 : Untuk mengubah dalam satuviewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Langkah 2 : Untuk mengubah seluruh aplikasi

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

Langkah 3 : Tambahkan juga ini di masing viewWillAppear- masing untuk menyesuaikan statusbarketinggianiOS7

    [[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

Saya telah mencapai bilah status seperti iOS 6 di iOS 7.

Setel UIViewControllerBasedStatusBarAppearance menjadi NO di info.plist

Pase kode ini dalam - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsmetode

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

Ini dapat menekan semua tampilan Anda dengan 20 piksel. Untuk datang yang menggunakan kode berikut dalam -(void)viewDidAppear:(BOOL)animatedmetode

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

Anda harus mengatur nilai UserDefaults windowHeight setelah alokasi jendela seperti di didFinishLauncing Metode seperti

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

Pendekatan yang lebih baik adalah membuat UINavigationBar Anda heightsama dengan 64 bukannya 44. Kemudian bilah Anda akan meluas sampai ke puncak seperti di aplikasi Apple.
Aaron Brager

@AaronBrager Tapi persyaratan saya adalah untuk menampilkan status bar gaya iOS 6.
Desert Rose

Bisakah Anda menambahkan solusi untuk Landscape Orientation iOS 7 ?. Saya melakukan hal yang sama. tetapi tidak berfungsi di iOS 7 Landscape.
sathiamoorthy

@DesertRose THX! Ini berfungsi untuk saya tetapi memotong uitabbar di bagian bawah. Saya memiliki aplikasi berbasis pengontrol tab bar dengan 3 tampilan, 2 di antaranya adalah tableviewcontrollers.
marciokoko

1
SAMPAI Saya memutar perangkat (perangkat iOS 7 saya adalah iPad), ini memperbaikinya dengan sempurna. Tapi begitu saya memutar, bilah hitam tetap persis di tempat itu dan "tampilan" (maaf jika itu istilah teknis yang salah, saya seorang PhoneGap / web guy) mempertahankan ketinggiannya menyusut - kecuali itu tidak lagi tinggi, itu lebar. Solusi ini tidak mendukung rotasi tetapi ini adalah perbaikan terbaik yang pernah saya lihat - bagaimana bisa ditingkatkan untuk mengawasi rotasi perangkat? Terima kasih!
tylerl

2

Jika Anda menggunakan pembuat antarmuka, coba ini:

Di file xib Anda:

1) Pilih tampilan utama, atur warna latar belakang menjadi hitam (atau warna apa pun yang Anda inginkan bilah status

2) Pastikan latar belakang adalah subview mandiri yang diposisikan sebagai anak tingkat atas dari pandangan pengontrol.
Pindahkan latar belakang Anda untuk menjadi anak langsung dari pandangan pengontrol. Periksa panel autosisasi untuk memastikan bahwa Anda telah mengunci semua tepi bingkai, mengaktifkan kedua sumbu fleksibilitas, dan jika ini adalah UIImageView, atur mode konten ke Skala untuk diisi. Secara terprogram ini diterjemahkan ke contentMode yang diatur ke UIViewContentModeScaleToFill dan memiliki pengubahan ukuran mask otomatis ke (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).

3) Sekarang pindahkan semua yang dikunci ke atas - ke bawah sebesar 20 poin dan atur iOS 6/7 delta Y ke -20.
Semua anak-anak tingkat atas yang dikunci ke bingkai atas di panel autosizing perlu diturunkan 20pts dan iOS 8/7 delta Y diatur ke -20. (Cmd pilih semua itu, dan klik panah bawah 20 kali - apakah ada cara yang lebih baik?)

4) Sesuaikan tinggi iOS 6/7 delta dari semua item di atas yang memiliki ketinggian fleksibel. Setiap item yang dikunci ke bagian atas dan bawah bingkai dan memiliki ketinggian fleksibel yang diaktifkan di panel autosisasi juga harus memiliki tinggi iOS 6/7 delta yang diatur ke 20. Itu termasuk tampilan latar belakang yang disebutkan di atas. Ini mungkin tampak anti-intuitif, tetapi karena urutan penerapannya, ini perlu. Tinggi bingkai diatur terlebih dahulu (berdasarkan perangkat), kemudian delta diterapkan, dan akhirnya masker autosisasi diterapkan berdasarkan posisi offset semua bingkai anak - pikirkan sedikit, akan masuk akal.

5) Akhirnya, item yang dikunci ke bingkai bawah tetapi bukan frame atas tidak perlu delta sama sekali.

Itu akan memberi Anda bilah status identik di iOS7 dan iOS6.

Di sisi lain, jika Anda menginginkan gaya iOS7 dengan tetap mempertahankan kompatibilitas iOS6, maka atur nilai tinggi delta Y / delta ke 0 untuk tampilan latar belakang.

Untuk melihat lebih banyak info migrasi iOS7, baca posting lengkap: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


Tidak ada delta saat menggunakan tata letak otomatis
lostintranslation

2

Solusi saya adalah menambahkan UIViewdengan ketinggian 20 poin di atas jendela ketika di iOS 7. Kemudian saya membuat metode di kelas AppDelegate saya untuk menampilkan / menyembunyikan latar belakang bilah status "solid". Dalam 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;

Lalu saya membuat metode untuk memudarkan / menghapus latar belakang bilah status hitam:

- (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;
        }
    }];
}

Yang harus saya lakukan sekarang adalah menelepon [appDelegate showSolidStatusBar:YES]saat dibutuhkan.


2

Ini mungkin masalah besar jika Anda menggunakan tata letak Otomatis karena Anda tidak dapat lagi memanipulasi bingkai secara langsung. Ada solusi sederhana tanpa terlalu banyak bekerja.

Saya akhirnya menulis metode utilitas dalam Kelas Utilitas dan memanggilnya dari semua viewDidLayoutSubviewsMetode view controller .

+ (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];
        }
    }

Ganti viewDidLayoutSubviewsmetode Anda di pengontrol tampilan, tempat Anda menginginkan bilah status. Ini akan membantu Anda mengatasi beban Autolayout.

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

1

Cara termudah untuk melakukannya adalah menginstal SDK yang lebih lama ke Xcode terbaru Anda.

Bagaimana cara menginstal SDK lama ke Xcode terbaru?

  1. Anda bisa mendapatkan iOS 6.1 SDK dari http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html atau mengunduh Xcode yang lebih lama dan mendapatkan SDK dari isinya

  2. Unzip dan tempel folder ini ke /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

  3. Mulai ulang xcode.

  4. Anda sekarang dapat memilih SDK yang lebih lama pada pengaturan bangunan proyek Anda

Semoga ini bisa membantu Anda. Itu bekerja untuk saya =)


bekerja untukku. terima kasih @marcelosalloum tetapi masih mencari solusi untuk aplikasi phonegap (uiwebview) saya untuk mendukung bilah status transparan iOS7 untuk pembaruan aplikasi saya di masa depan. Terima kasih lagi. ;)
hanism

@marcellosaloum, apakah Anda yakin aplikasi akan diterima oleh Apple? Mereka mengatakan aplikasi yang dikompilasi dengan XCode 4 tidak akan lagi diterima ... itu sebenarnya berarti iOS 6 SDK.
Valerio

Aplikasi saya memang diterima karena Xcode5 dapat mengkompilasi SDK iOS yang lebih lama. Saya tidak yakin apakah AppStore akan menolak aplikasi yang dibuat Xcode4 tetapi (Xcode4! = IOS 6 SDK) seperti yang Anda katakan.
marcelosalloum

Apakah itu setelah tanggal 1 Februari? Pada hari itu Apple membuat itu wajib.
Valerio

Tidak, yang terakhir menyentuh kode itu tahun lalu, sobat. Tidak tahu Apple telah membuat itu wajib (meskipun tidak senang tahu). Tolong posting di sini tautan yang mengatakan itu? Cheers
marcelosalloum

1

Sebagai menggunakan presentViewController:animated:completion:kekacauan itu window.rootViewController.view, saya harus menemukan pendekatan yang berbeda untuk masalah ini. Saya akhirnya bisa bekerja dengan modals dan rotasi dengan mensubklasifikasikan UIView dari rootViewController saya.

.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

Anda sekarang memiliki solusi yang kuat untuk animasi iOS7.


1

Saya terlambat untuk jawaban ini, tetapi saya hanya ingin membagikan apa yang saya lakukan, yang pada dasarnya merupakan solusi termudah

Pertama-tama-> Buka info.plistFile Anda dan tambahkan Style Bar Style-> Transparent Black Style (Alpha of 0.5)

Sekarang, ini dia: -

Tambahkan kode ini di AppDelegate.m Anda

- (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

Solusi saya yang sangat sederhana (dengan asumsi Anda hanya didukung orientasi vertikal) adalah mendefinisikan kembali batas jendela aplikasi untuk versi iOS di bawah 7, dalam delegasi App didFinishLaunchingWithOptions metode:

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];
}

Kode Anda hanya menggeser 'y' dari 0 ke 20 tetapi tidak menyesuaikan ketinggian sehingga Anda harus menambahkan screenBounds.size.height - = 20; tepat setelah screenBounds.origin.y = 20;
Amit C.

0

Anda dapat menyembunyikan bilah status secara bersamaan. Jadi aplikasi Anda akan menjadi layar penuh. Saya pikir itu yang terbaik yang akan Anda dapatkan.

UIStatusBarStyleNone atau atur dalam pengaturan target.


2
di mana menentukan UIStatusbarstylenone
user4951

0

Langkah-langkah Untuk Menyembunyikan bilah status di iOS 7:

1. Buka file info.plist aplikasi Anda.

2.Dan Set, Lihat tampilan status berbasis pengontrol: Boolean NO

Semoga saya memecahkan masalah status bar .....


0

Untuk terus bekerja dengan setStatusBarHidden: Saya menggunakan kategori ini:

@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

Ini mungkin terlambat untuk dibagikan, tetapi saya memiliki sesuatu untuk disumbangkan yang mungkin dapat membantu seseorang, saya mencoba untuk membuat sub-kelas UINavigationBar dan ingin membuatnya tampak seperti ios 6 dengan bilah status hitam dan teks bilah status berwarna putih.

Inilah yang saya temukan bekerja untuk itu

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

Itu membuat latar belakang bilah status saya hitam, teks bilah status putih dan bilah navigasi putih.

iOS 9.3, XCode 7.3.1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.