iOS 7 - Bilah status tumpang tindih dengan tampilan

109

Saya memiliki ViewControlleryang ada di dalam a UINavigationcontroller, tetapi navigationBar tersembunyi. Saat saya menjalankan aplikasi di iOS 7, bilah status muncul di atas tampilan saya. Apakah ada cara untuk menghindari ini?

Saya tidak ingin menulis kode khusus OS apa pun.

Masukkan deskripsi gambar di sini

Saya mencoba mengatur View controller-based status bar appearanceke NO, tetapi tidak memperbaiki masalah.

aryaxt
sumber
Saya telah memposting jawaban saya untuk menampilkan bilah status seperti iOS 6 di iOS 7 stackoverflow.com/questions/18294872/…
Desert Rose
2
Anda perlu menyesuaikan asal y dan nilai delta juga untuk menangani masalah bilah status. Ini dapat membantu Anda stackoverflow.com/q/18980925/1545180
Ganapathy

Jawaban:

95

Xcode 5 iOS 6/7 Deltasyang khusus dibuat untuk mengatasi masalah ini. Di storyboard, saya memindahkan tampilan 20 piksel ke bawah agar terlihat tepat di iOS 7 dan untuk membuatnya kompatibel dengan iOS 6, saya mengubah Delta yke -20.

masukkan deskripsi gambar di sini

Sejak storyboard saya tidak menggunakan auto-layout, untuk mengubah ukuran ketinggian pandangan benar pada iOS 6 aku harus mengatur Delta heightserta Delta Y.

aryaxt
sumber
8
jawaban Anda benar tetapi tidak berfungsi dengan tampilan 4 ". Perbarui jawaban Anda jika Anda juga dapat membuatnya berfungsi untuk tampilan 4". Terima kasih sebelumnya.
2
@AnkitMehta Saya tidak perlu melakukan sesuatu yang spesifik untuk 4 "iphones
aryaxt
5
bekerja untuk saya. Perhatikan bahwa untuk melihat delta ini, Anda harus membatalkan pilihan 'Use Autolayout' di bawah 'Identity and Type' untuk storyboard.
marsant
2
Saya menemukan selain menyetel -20 untuk ∆Y, saya juga harus menyetel +20 ke ∆Height
Toland Hon
3
Apa yang terjadi jika tinggi statusbar akan berubah? F.ex .: ketika pengguna mengaktifkan hot-spot, dll .... maka tingginya adalah 40px ...
Lukasz
69

Jika Anda sama sekali TIDAK menginginkan bilah status, Anda perlu memperbarui plist Anda dengan data ini: Untuk melakukan ini, di plist, tambahkan 2 pengaturan tersebut:

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

Di iOS 7, Anda diharapkan mendesain aplikasi Anda dengan mempertimbangkan bilah status transparan yang dilapisi. Lihat aplikasi Cuaca iOS 7 baru sebagai contoh.

Nathan H.
sumber
3
Ini sebenarnya satu-satunya jawaban yang bagus karena ini memperbaiki masalah pada intinya dengan cara yang seharusnya dilakukan. Jadi: perlu suara positif!
sebelas59
5
Mungkin cocok untuk beberapa situasi, tetapi Anda ingin sangat berhati-hati dalam menyembunyikan bilah status. Hanya untuk tampilan dengan layar penuh yang dapat dibenarkan, seperti pemutar media atau pemirsa gambar.
smileBot
1
@ eleven59, maksud Anda seperti yang diinginkan para otokrat di Apple.
JohnK
1
Jelas seperti ini lebih baik daripada mengubah offset pengontrol tampilan (yang terasa sangat kotor).
Benjamin Oman
menyembunyikan bilah status bukanlah ide yang baik ... Saya tahu ini adalah cara termudah untuk menangani iOS 7, tetapi waktu DIPERLUKAN ...
Fahim Parkar
43

Ini adalah perilaku default untuk UIViewControlleriOS 7. Tampilan akan menjadi layar penuh yang berarti bilah status akan menutupi bagian atas tampilan Anda.

Jika Anda memiliki UIViewControllerdalam a UINavigationControllerdan navigationBar terlihat, Anda dapat memiliki kode berikut di Anda viewDidLoadatau memiliki gambar latar belakang untuk navigationBar melakukan trik.

self.edgesForExtendedLayout = UIRectEdgeNone;

Jika Anda menyembunyikan navigationBar, maka Anda harus menyesuaikan semua elemen UIView dengan menggeser 20 poin. Saya tidak melihat solusi lain. Gunakan tata letak otomatis akan sedikit membantu.

Berikut adalah contoh kode untuk mendeteksi versi iOS, jika Anda ingin kompatibilitas ke belakang.

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;
}
Vincent
sumber
18
Daripada mengambil, mengurai, dan membandingkan versi sistem, disarankan untuk menggunakanif ([self respondsToSelector:@selector(edgesForExtendedLayout)])
Sebastian Hojas
15

Hanya solusi kerja yang saya buat sendiri.

Ini adalah subclass UIViewController saya https://github.com/comonitos/ios7_overlaping

1 Subclass dari UIViewController

2 Subkelas window.rootViewController Anda dari kelas itu.

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 Tambahkan ini untuk membuat bilah status Anda putih Tepat setelah [self.window makeKeyAndVisible]; !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
comonitos
sumber
tapi ini tidak menunjukkan waktu di atas ... Kerugian terbesar ... :(
Fahim Parkar
Berfungsi bagus, tetapi untuk langkah 4 Anda harus menggunakan preferStatusBarStyle di pengontrol tampilan Anda, karena setStatusBarStyle sudah usang dan tindakan defaultnya adalah tidak melakukan apa pun. 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);
    }
  }
}

Tambahkan Kunci di plist --- Lihat tampilan bilah status berbasis pengontrol: TIDAK

Darshit Shah
sumber
ubah warna jendela jika perlu
Darshit Shah
Terima kasih, Ini menyelesaikan masalah saya yang tumpang tindih. Tapi satu masalah masih ada - Lihat tampilan bilah status berbasis pengontrol: TIDAK adalah menyembunyikan bilah status. Tapi ketika saya setel ke YES, maka status barnya tidak muncul dan ketika saya setel ke NO maka status barnya muncul. Jadi tolong beri tahu saya apakah saya salah dengan konsep atau apa?
Nayan
1
Saya pikir karena mengambil warna semi transparant default yang ditetapkan di didFinishLaunchingWithOptions 'self.window.backgroundColor = [UIColor blueColor];' dan atur di plist Lihat tampilan bilah status berbasis pengontrol YA
Darshit Shah
Terima kasih banyak! Selain itu, hanya untuk menunjukkan bahwa dokumen apple merekomendasikan jika memeriksa dengan if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} else {}. Bersulang!
Joel Balmer
Terima kasih banyak Kode Anda sangat membantu kami Harap perlu menjelaskan tentang fungsi viewWillLayoutSubviews.
pengguna3182143
4

Untuk menyembunyikan bilah status di ios7 ikuti langkah-langkah sederhana ini:

Dalam " Resources" folder Xcode goto dan buka " (app name)-Info.plist file".

  • periksa " View controller based status bar appearance" kunci dan setel nilainya " NO"
  • periksa " Status bar is initially hidden" kunci dan setel nilainya " YES"

Jika kunci tidak ada, Anda dapat menambahkannya dengan memilih " information property list" di atas dan klik ikon +

Mandeep Pasbola
sumber
Baca pertanyaannya dengan jelas, Dia tidak meminta untuk menyembunyikan bilah status sepenuhnya.
ShayanK
1
@AspersionCast: Dia bertanya "Apakah ada cara untuk menghindari ini?" dan ini salah satu cara untuk menghindarinya.
Mandeep Pasbola
3

Jika menggunakan xibs, implementasi yang sangat mudah adalah merangkum semua subview di dalam tampilan container dengan flag pengubah ukuran (yang akan Anda gunakan untuk kompatibilitas 3.5 "dan 4") sehingga hierarki tampilan terlihat seperti ini

xib heirarki

dan kemudian viewDidLoad, lakukan sesuatu seperti ini:

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

Dengan cara ini, ujung pena tidak perlu dimodifikasi untuk kompatibilitas iOS 7. Jika Anda memiliki latar belakang, itu dapat disimpan di luar containerViewdan membiarkannya menutupi seluruh layar.

tipycalFlow
sumber
3

Ini semua yang diperlukan untuk menghapus bilah status. masukkan deskripsi gambar di sini

Tony
sumber
2

Untuk Bilah Navigasi:

Penulisan kode ini:

self.navigationController.navigationBar.translucent = NO;

baru saja melakukan trik untuk saya.

Saru
sumber
1

Jawaban Vincent, edgeForExtendedLayout berhasil untuk saya.

Makro ini membantu dalam menentukan versi os sehingga lebih mudah

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

tambahkan makro ini ke file prefix.pch dari proyek Anda dan dapat diakses di mana saja

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
}
RamaKrishna Chunduri
sumber
1
untuk saya self.edgesForExtendedLayout = UIRectEdgeNone; tidak berfungsi ... ada alasan mengapa?
Fahim Parkar
1

Saya telah memposting jawaban saya ke posting lain dengan pertanyaan yang sama dengan yang satu ini.

Dari Panduan transisi Apple iOS7, https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

Secara khusus automaticallyAdjustsScrollViewInsets=YESdan set self.edgesForExtendedLayout = UIRectEdgeNonebekerja untuk saya ketika saya tidak ingin tumpang tindih dan saya memiliki file tableviewcontroller.

Liangjun
sumber
0

Jika Anda ingin "Gunakan Autolayout" diaktifkan dengan biaya berapa pun, tempatkan kode berikut di viewdidload.

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

Bilah status dan bilah navigasi saya tumpang tindih setelah kembali dari tampilan lanskap YTPlayer. Inilah solusi saya setelah mencoba versi @comonitos tetapi tidak berfungsi di iOS 8 saya

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

Panggil saja fungsi ini kapan pun Anda ingin memperbaiki posisi bilah navigasi. Saya menghubungi YTPlayerViewDelegateplayerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
John Pang
sumber