Bilah navigasi muncul di atas tampilan dengan iOS7 SDK baru

113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Di versi sebelumnya, ini berfungsi dengan benar. Bilah pencarian muncul di bawah statusbarbilah navigasi dan. Ini tableviewmuncul di bawah bilah pencarian

Tetapi ketika saya menjalankan ini Xcode 5 sdk iOS 7, bilah pencarian tidak terlihat (menurut saya ditempatkan di bawah bilah status dan bilah navigasi), dan juga bilah navigasi muncul di atas tampilan tabel.

Apakah akan diperbaiki dengan iOS 7rilis stabil?

Atau apakah ini masalah pengkodean saya?

Atau harus kita menanganinya dengan menambahkan y (y = statubar height + nav bar height)nilai iOS 7?

Saya baru-baru ini mengunduh Xcode 5 DP untuk menguji aplikasi saya di iOS 7. Hal pertama yang saya perhatikan dan konfirmasikan adalah bahwa batas tampilan saya tidak selalu diubah ukurannya ke akun untuk bilah status dan bilah navigasi.

Di viewDidLayoutSubviews, saya mencetak batas tampilan:

{{0, 0}, {320, 568}}

Ini mengakibatkan konten saya muncul di bawah bilah navigasi dan bilah status.

Saya tahu saya bisa menghitung sendiri tinggi badan dengan mendapatkan tinggi layar utama, mengurangkan tinggi bilah status dan tinggi bilah navigasi, tetapi sepertinya itu pekerjaan tambahan yang tidak perlu.

Apakah ada orang lain yang mengalami masalah ini?

MEMPERBARUI:

Saya telah menemukan solusi untuk masalah khusus ini. 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.

Namun, saya belum menemukan perbaikan untuk kasus ketika Anda ingin bilah navigasi menjadi tembus cahaya. Misalnya, melihat foto layar penuh, saya ingin bilah navigasi tembus, dan tampilan dibingkai di bawahnya. Itu berfungsi, tetapi ketika saya beralih menampilkan / menyembunyikan bilah navigasi, saya telah mengalami hasil yang lebih aneh. Subview pertama (a UIScrollView) mendapatkan batasan asal y berubah setiap waktu.


sumber
4
Perangkat lunak beta. Forum pengembang Apple lebih sesuai. Selain itu, masalahnya secara eksplisit disebutkan dalam panduan transisi.
Sulthan

Jawaban:

188

Itu tidak sepenuhnya benar. Telah ada properti baru yang diperkenalkan di iOS 7 yang memungkinkan Anda menyesuaikan perilaku tata letak seperti di versi iOS sebelumnya. Tempatkan potongan kode ini di pengontrol tampilan Anda, dan Anda siap melakukannya! Ruang yang digunakan bilah navigasi Anda harus diperhitungkan secara otomatis

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

Anda perlu menambahkan hal di atas dalam -(void)viewDidLoadmetode Anda .

Catatan: Anda harus menggunakan rilis GM terbaru dari iOS 7 dan Xcode 5 sekarang karena API telah berubah dari versi beta.

Satu Kru
sumber
di kode saya tertulis edgeForExtendedLayout. Penggunaan pengenal UIExtendedEdgeNone yang tidak dideklarasikan. Tolong bantu.
6
Ini diubah menjadi UIRectEdgeNone
Simon
6
Itulah alasan mengapa pertanyaan seperti itu tidak boleh ditanyakan atau dijawab di sini.
Sulthan
Saya tidak mengerti mengapa jika Anda ingin menjaga kompatibilitas dengan ios6 Anda dipaksa untuk memperkenalkan kasus bersyarat dengan kode untuk memeriksa apakah pengontrol memiliki properti itu atau tidak ..
jerrygdm
12
Tampaknya ini hanya berfungsi jika tampilan disematkan dalam UINavigationController.
pojo
37

Tangkapan layar dari storyboard

Jika Anda bekerja di Storyboard (yang sangat saya sarankan!) Ini solusinya: Anda dapat menonaktifkan "Perpanjang Tepi" ViewController Anda di storyboard. Anda harus melakukan ini untuk setiap viewController. Anda dapat menonaktifkan tepi yang diperluas dengan mengklik ikon viewController di stortyboard (di samping productOwner di bawah tampilan itu sendiri) dan kemudian memilih inspektur atribut (Seperti yang ditunjukkan gambar).

Ini juga akan mengatur garis perataan seperti iOS 6.

Alat hebat lainnya di xCode 5 adalah "Pratinjau": klik tombol butler (asisten editor) dan pilih Pratinjau. di sana Anda dapat memilih iOS 6 dan melihat bagaimana desain storyboard Anda akan terlihat di iOS 6.

Bagus sekali: D

[Memperbarui]

Hati-hati: menonaktifkan "Perpanjang Tepi" dapat mengakibatkan cahaya hitam di bilah navigasi saat aplikasi memasuki latar belakang di iOS7. cahaya juga akan terlihat pada tampilan multitasking (tekan dua kali tombol home). ini dapat diatasi dengan menyetel warna latar belakang tampilan bilah navigasi menjadi putih.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
sumber
Ya, ini adalah solusi yang datang dari perspektif papan cerita. Terima kasih.
jpittman
12

Seperti yang dikatakan OP, ada solusi sederhana untuk ini yaitu mengatur bilah navigasi menjadi buram. Daripada melakukan ini dalam kode, cukup hapus centang "Translucent" untuk bilah navigasi root Anda:

masukkan deskripsi gambar di sini

Tawaran
sumber
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Ini berfungsi pada simulator iOS 7 (Xcode 5 DP5)

yhlin
sumber
2
ini berfungsi dengan baik di ios7 tetapi jika saya menjalankan aplikasi di ios 6 dan sebelumnya lagi tampilan akan dipindahkan. Ada solusi untuk ini ?. Juga kita perlu mengatur properti ini di setiap metode pemuatan viewdid pengontrol tampilan?
loganathan
Anda selalu dapat memeriksa apakah iOS saat ini adalah 7 dengan ini jika:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross
2

semua jawaban ini sangat membantu, terutama MQoder, tetapi bagi saya, saya juga harus menyetel bilah atas default ke "navigasi hitam buram".

masukkan deskripsi gambar di sini

jasonpurdy.dll
sumber
1

@ Jawaban One Man Crew benar, tapi:

Saya akan merekomendasikan untuk menggunakan kode ini untuk menghindari kesalahan saat menjalankan aplikasi pada versi yang lebih lama:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
Yossi
sumber
0

self.edgesForExtendedLayout = UIRectEdgeNone;

Dan Anda perlu melakukan ini di AppDelegate # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Jika tidak, warna latar belakang Bilah Navigasi akan berubah menjadi abu-abu. Karena Bilah Navigasi transparan tumpang tindih dengan jendela.

EIMEI
sumber
0

Jika Anda ingin menjaga transparansi saat pengguna menggulir tampilan tabel Anda, Anda dapat mengatur contentInset-nya:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
Enrico Susatyo
sumber
-1

Salah satu solusinya adalah dengan menggunakan Pengontrol Navigasi. Ini secara otomatis menyelesaikan masalah. Juga gunakan Xcode 5 daripada versi Pratinjau Xcode karena versi beta.

Jayprakash Dubey
sumber