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.

Sam D20
sumber
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 .

Deepesh
sumber
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;
Sumit Mundra
sumber
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

Achyut Sagar
sumber
12

Ini berfungsi untuk cepat juga di iOS 8.1

navigationController?.navigationBar.translucent = false
uplearnedu.com
sumber
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];

jbouaziz.dll
sumber
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
Md. Najmul Hasan
sumber
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);
}
malkoty
sumber
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.

Krivoblotsky
sumber
-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.

Farhad Malekpour
sumber
-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.

Nicoli
sumber
1
Saya tidak berpikir ini akan mempengaruhi tampilan sama sekali.
Enrico Susatyo