Bagaimana cara mencegah UINavigationBar menutupi bagian atas tampilan di iOS 7?


99

Setelah memperbarui ke Xcode 5, bilah navigasi di semua tampilan aplikasi saya telah bergeser ke bawah. Berikut adalah beberapa tangkapan layar, yang pertama menampilkan semua yang ada di tampilan saat ditarik ke bawah, dan yang kedua menampilkan semuanya tanpa tersentuh. Bilah pencarian harus dimulai di mana bilah navigasi.

Semua konten Semua Konten di Idle

Adakah yang tahu bagaimana saya bisa memperbaikinya?

edit: saya telah mencoba rekomendasi ini sebelumnya:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Tapi hasilnya sangat aneh.

Upaya Solusi

Ini mungkin karena saya memiliki "menu geser" di bawah pengontrol tampilan ini yang muncul karena transparansi bilah navigasi.


Di sini Anda adalah solusi lain untuk masalah ini. stackoverflow.com/a/51491645/10148333
Afonso

Jawaban:


235

Setel properti tembus bilah navigasi ke TIDAK :

self.navigationController.navigationBar.translucent = NO;

Ini akan memperbaiki tampilan agar tidak dibingkai di bawah bilah navigasi dan bilah status.

Jika Anda harus menampilkan dan menyembunyikan bilah navigasi, gunakan

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

dalam viewDidLoadmetode Anda .


1
Saya telah menempatkan ini di bawah viewDidLoadnamun tidak menghasilkan perubahan.
Sam D20

13
membuatnya dalam fungsi viewDidLayoutSubviews
Hindu

1
Menambahkan ini ke viewDidLayoutSubviews berhasil. Saya menghargai bantuan tuan-tuan!
Sam D20

Hai, Ada Pertanyaan? atau apakah itu pujian?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; membantu saya
luky

32

Secara iOS 7default, semua nilai properti Translucent Controller adalah YA, jadi Anda menyetel properti translucent NO untuk masalah ini.

self.navController.navigationBar.translucent = NO;

2
Tidak ada properti "navController". Gunakan ini: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

saya membuat objek navigtionbarcontroller di app delegate dan memberi nama navController.
Sumit Mundra

21

Anda dapat menonaktifkan "Perpanjang tepi" di Atribut inspektur Pengontrol Tampilan layar ini (seperti yang ditunjukkan pada gambar di bawah):

masukkan deskripsi gambar di sini


12

Ini berfungsi untuk cepat juga di iOS 8.1

navigationController?.navigationBar.translucent = false

8

Jika Anda ingin mempertahankan kejelasan pada Anda navigationBar, di akhir viewDidLoadatau di Anda viewWillAppeartambahkan baris kode ini:

[self.view sendSubviewToBack:self.tableView]

Entah bagaimana jika scrollViewsubkelas Anda ( UITableView,, UICollectionViewdll.) Berada di index0 dalam tampilan Anda saat ini subviews, secara otomatis akan menyesuaikan insets sesuai dengan Anda navigationBar. Dan itu seharusnya tidak memengaruhi UI Anda dalam versi sebelum iOS7 juga.


EDIT Jika Anda menginisialisasi secara UITableViewterprogram, yang terbaik adalah menambahkannya ke tampilan menggunakan ini[self.view insertSubview:self.tableView atIndex:0];


Ini harus menjadi jawaban yang benar. Jika Anda menambahkan subview secara terprogram, Anda dapat melakukannya [self.view insertSubview:self.tableView atIndex:0];alih - alih mengirimnya ke belakang setelah Anda menambahkannya.
smitt04

Benar. Tetapi tanpa mengetahui bagaimana dia memulai pengontrolnya (secara terprogram, pembuat antarmuka), kami tidak dapat berasumsi bahwa ini adalah solusi terbaik. Meskipun saya telah mengedit jawaban saya.
jbouaziz

Ini berfungsi tetapi terlihat seperti retasan. Apakah ada pemberitahuan dalam dokumentasi resmi tentang ini?
John Tracid

4

Cepat 4 :

Tetapkan baris kode berikut dalam metode viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Anda dapat menambahkan metode ini ke pengontrol tampilan Anda seperti yang ditunjukkan di URL ini :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Pendekatan lain adalah menyetel self.automaticallyAdjustsScrollViewInsets = YES;pengontrol tampilan Anda. Ini diaktifkan secara default. Tetapi dalam kasus Anda:

Saya melihat Anda menggunakan EGORefreshHeaderView. Itu bermain dengan contentInset dari UITableView. Jadi saat Anda melepaskannya, header akan mengatur ulang inset atas alih-alih mengembalikan nilai sebelumnya.


-1

Jika Anda ingin memiliki kontrol penuh pada tampilan dan menghindari kesalahan penyesuaian iOS, subclass UITableView dan sesuaikan insets (baik scroll dan indikator) di - (void) willMoveToWindow: (UIWindow *) newWindow. Bekerja untuk saya.


-4

Opsi lainnya adalah membuka file Info.plist Anda dalam mode kode sumber dan memasukkan info berikut:

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

Semoga ini membantu.


1
Saya tidak berpikir ini akan mempengaruhi tampilan sama sekali.
Enrico Susatyo
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.