Di iOS 7 UIStatusBar
telah dirancang sedemikian rupa sehingga menyatu dengan tampilan seperti ini:
(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 perbedaanself.view.center.x
dapat 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 didFinishLaunchingWithOptions
metode, tapi itu solusinya, jalan pintas menghindari masalah, jadi saya tidak menganggap itu solusi nyata.
UIStatusBarDefault
untuk bilah status hanya membuat isinya berwarna hitam. Ini tidak akan membuat fungsinya kembali seperti di iOS6.Jawaban:
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:
Tidak ada cara untuk mempertahankan tata letak status bar gaya iOS 6. Bilah status akan selalu tumpang tindih dengan aplikasi Anda di iOS 7
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.
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.
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.
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.
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.
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.
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.
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.
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.
sumber
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:
Diatur
UIViewControllerBasedStatusBarAppearance
keNO
dalaminfo.plist
(Untuk memilih tidak memiliki pengontrol tampilan, sesuaikan gaya bilah status sehingga kami dapat mengatur gaya bilah status dengan menggunakan metode UIApplicationstatusBarStyle.)Di AppDelegate
application:didFinishLaunchingWithOptions
, panggiluntuk:
Periksa apakah itu iOS 7.
Setel konten bilah status menjadi putih, yang bertentangan dengan UIStatusBarStyleDefault.
Hindari subview yang bingkainya melampaui batas yang terlihat (untuk tampilan yang bergerak ke tampilan utama dari atas).
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
di
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
dan menciptakan metode baru dalam AppDelegate: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
di
AppDelegate.h
untuk membuatbackground
sebuah 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)
:Jangan lupa untuk
@synthesize background;
setelah@implementation AppDelegate
!sumber
Saya memecahkan masalah dengan kode berikut. Ini untuk menambahkan bilah status. didFinishLaunchingWithOptionsDan 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.sumber
SOLUSI:
Atur di viewcontroller Anda atau di rootviewcontroller dengan mengganti metode:
sumber
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 appearance
diatur 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
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:
Use Autolayout
tidak dicentang untuk Storyboard Anda (ini karena jika tidak "iOS 6/7 Delta" tidak ditampilkan di Ukuran Inspektur). Untuk melakukan ini: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.
sumber
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.
sumber
Apple merilis Tanya Jawab Teknis QA1797: Mencegah Bilah Status dari Menutupi Pandangan Anda . Ini berfungsi dengan baik untuk versi iOS 6 dan iOS 7.
sumber
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:
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! ~ "~
sumber
Alternatif kecil untuk jawaban Archy Holt, sedikit lebih sederhana:
Sebuah. Diatur
UIViewControllerBasedStatusBarAppearance
keNO
dalam info.plistb. Dalam
AppDelegate
'sapplication:didFinishLaunchingWithOptions:
, panggilan:Dan tambahkan metode:
Anda juga dapat mempertimbangkan subclass
UIWindow
untuk menanganiUIApplicationDidChangeStatusBarOrientationNotification
sendiri.sumber
Saya menggunakan ini di semua pengontrol tampilan saya, itu sederhana. Tambahkan baris ini di semua metode viewDidLoad Anda:
sumber
Coba metode sederhana ini ....
Langkah 1 : Untuk mengubah dalam satu
viewController
Langkah 2 : Untuk mengubah seluruh aplikasi
Langkah 3 : Tambahkan juga ini di masing
viewWillAppear
- masing untuk menyesuaikanstatusbar
ketinggianiOS7
sumber
Ada opsi di Interface Builder yang memanggil properti iOS 6/7 Delta yang bertujuan untuk menyelesaikan masalah offset.
Lihatlah di pertanyaan Stack Overflow Interface Builder: Untuk apa Layout iOS 6/7 Deltas dari UIView? .
sumber
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 *)launchOptions
metodeIni dapat menekan semua tampilan Anda dengan 20 piksel. Untuk datang yang menggunakan kode berikut dalam
-(void)viewDidAppear:(BOOL)animated
metodeAnda harus mengatur nilai UserDefaults windowHeight setelah alokasi jendela seperti di didFinishLauncing Metode seperti
sumber
height
sama dengan 64 bukannya 44. Kemudian bilah Anda akan meluas sampai ke puncak seperti di aplikasi Apple.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
sumber
Solusi saya adalah menambahkan
UIView
dengan 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". Dalamapplication:didFinishLaunchingWithOptions:
:Lalu saya membuat metode untuk memudarkan / menghapus latar belakang bilah status hitam:
Yang harus saya lakukan sekarang adalah menelepon
[appDelegate showSolidStatusBar:YES]
saat dibutuhkan.sumber
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
viewDidLayoutSubviews
Metode view controller .Ganti
viewDidLayoutSubviews
metode Anda di pengontrol tampilan, tempat Anda menginginkan bilah status. Ini akan membantu Anda mengatasi beban Autolayout.sumber
Cara termudah untuk melakukannya adalah menginstal SDK yang lebih lama ke Xcode terbaru Anda.
Bagaimana cara menginstal SDK lama ke Xcode terbaru?
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
Unzip dan tempel folder ini ke /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
Mulai ulang xcode.
Semoga ini bisa membantu Anda. Itu bekerja untuk saya =)
sumber
Sebagai menggunakan
presentViewController:animated:completion:
kekacauan ituwindow.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
.m
Anda sekarang memiliki solusi yang kuat untuk animasi iOS7.
sumber
Saya terlambat untuk jawaban ini, tetapi saya hanya ingin membagikan apa yang saya lakukan, yang pada dasarnya merupakan solusi termudah
Pertama-tama-> Buka
info.plist
File Anda dan tambahkan Style Bar Style-> Transparent Black Style (Alpha of 0.5)Sekarang, ini dia: -
Tambahkan kode ini di AppDelegate.m Anda
sumber
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:
sumber
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.sumber
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 .....
sumber
Untuk terus bekerja dengan setStatusBarHidden: Saya menggunakan kategori ini:
sumber
Saya temukan di sini adalah alternatif dan solusi terbaik untuk masalah bilah navigasi ini di iOS7 !!
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Saya harap ini akan menghapus semua pertanyaan dan kekhawatiran kami.
sumber
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
Itu membuat latar belakang bilah status saya hitam, teks bilah status putih dan bilah navigasi putih.
iOS 9.3, XCode 7.3.1
sumber