Layar pertama aplikasi saya adalah UITableViewController
tanpa bilah navigasi, yang berarti bahwa konten mengalir di bawah bilah status sehingga ada banyak tabrakan teks. Saya telah menyesuaikan kedua properti Under top bars
dan Adjust scroll view insets
yang benar-benar menghentikannya agar tidak bergulir di bawah, tetapi dengan biaya menjaga bagian atas tampilan tabel di bawah. Saya telah berusaha mengatur UITableView
frame untuk diimbangi dengan 20 piksel, tetapi tampaknya tidak berpengaruh dan karena saat ini saya membutuhkan aplikasi agar kompatibel dengan iOS 6 Saya tidak bisa melompat ke iOS 7 Storyboards untuk memaksa autolayout menggunakan panduan tinggi atas. Adakah yang menemukan solusi yang berfungsi untuk kedua versi?
Hal-hal yang saya coba: pengaturan edgesForExtendedLayout
, mengubah pengaturan dalam Storyboard untuk Under top bars
dan Adjust scroll view
, memaksa bingkai ke area baru.
Sebuah gambar bernilai ribuan kata:
sumber
UITableView
header di sana, itu juga mengalir di bawah status bar.Jawaban:
Bagi siapa pun yang tertarik mereplikasi ini, cukup ikuti langkah-langkah ini:
UIViewController
UITableViewController
dari Perpustakaan ObjekJika Anda mengikuti langkah-langkah di atas, ketika Anda menjalankan aplikasi, Anda tidak akan melihat apa-apa, termasuk mengubah kotak centang Xcode menjadi "Extend Edges Under {Top, Bottom, Opaque} Bars" berfungsi untuk menghentikan baris pertama agar tidak muncul di bawah bilah status, Anda juga tidak bisa membahas ini secara terprogram.
Misalnya, dalam skenario di atas, yang berikut ini tidak akan berpengaruh:
Masalah ini bisa sangat membuat frustrasi, dan saya percaya ini adalah bug pada Apple, terutama karena itu muncul di pra-kabel mereka sendiri
UITableViewController
dari perpustakaan objek.Saya tidak setuju dengan semua orang yang mencoba menyelesaikan ini dengan menggunakan segala bentuk "Angka Ajaib" misalnya "menggunakan delta 20px". Pemrograman yang sangat erat seperti ini jelas bukan yang diinginkan Apple untuk dilakukan di sini.
Saya telah menemukan dua solusi untuk masalah ini:
Mempertahankan
UITableViewController
adegan :Jika Anda ingin menyimpannya
UITableViewController
di storyboard, tanpa secara manual menempatkannya di tampilan lain, Anda dapat menyematkanUITableViewController
dalamUINavigationController
(Editor> Tanamkan Di> Pengontrol Navigasi) dan hapus centang "Shows Navigation Bar" di inspektur . Ini menyelesaikan masalah tanpa perlu penyesuaian tambahan, dan itu juga melindungiUITableViewController
adegan Anda di storyboard.Menggunakan AutoLayout dan menyematkannya
UITableView
ke tampilan lain (saya percaya ini adalah bagaimana Apple ingin kita melakukan ini) :Buat yang kosong
UIViewController
dan seretUITableView
di dalamnya. Kemudian, Ctrl-drag dari AndaUITableView
ke bilah status. Saat mouse mencapai bagian bawah bilah status, Anda akan melihat gelembung Autolayout yang bertuliskan "Top Layout Guide". Lepaskan mouse dan pilih "Vertical Spacing". Itu akan memberi tahu sistem tata letak untuk meletakkannya tepat di bawah bilah status.Saya telah menguji kedua cara pada aplikasi kosong dan keduanya berfungsi. Anda mungkin perlu melakukan beberapa penyesuaian tambahan untuk membuatnya bekerja untuk proyek Anda.
sumber
Jika Anda melakukan hal-hal secara programatik dan menggunakan
UITableViewController
tanpaUINavigationController
taruhan, taruhan terbaik Anda adalah dengan melakukan hal berikut diviewDidLoad
:Cepat 3
Swift Sebelumnya
The
UITableViewController
masih akan bergulir di belakang status bar tetapi tidak akan berada di bawah ketika menggulir ke atas.sumber
topLayoutGuide
panjang sebagai gantinya.UIApplication.sharedApplication.statusBarFrame.size.height
bukan 20.Harap dicatat: Ini berfungsi untuk saya untuk konfigurasi berikut:
Jika dua persyaratan di atas tidak terpenuhi, jarak tempuh Anda mungkin beragam.
Pos Asli
Saya membuat tampilan saya secara terprogram dan ini akhirnya berhasil untuk saya:
Sumber (di bagian topLayoutGuide di bagian bawah hal.39).
sumber
Menambahkan ke jawaban teratas:
setelah metode ke-2 pada awalnya tampaknya tidak berhasil saya melakukan beberapa bermain-main dan telah menemukan solusinya.
TLDR; solusi ke-2 jawaban atas hampir berhasil, tetapi untuk beberapa versi xCode ctrl + menyeret ke "Top Layout Guide" dan memilih Vertical Spacing tidak menghasilkan apa-apa. Namun, dengan terlebih dahulu menyesuaikan ukuran Tampilan Tabel dan kemudian memilih "Top Space to Top Layout Guide" berfungsi
Seret ViewController kosong ke storyboard.
Seret objek UITableView ke dalam Tampilan. (Tidak UITableViewController). Posisikan di tengah menggunakan panduan tata letak biru.
Buat subkelas kustom Anda dari UIViewController, dan tambahkan
<UITableViewDataSource, UITableViewDelegate>
protokolnya. Jangan lupa untuk mengatur ViewController storyboard Anda ke kelas ini di Identity Inspector.Buat outlet untuk TableView Anda di file implementasi Anda, dan beri nama "tableView"
Sekarang untuk bagian yang tidak terpotong ke status bar.
Sekarang Anda dapat mengatur tampilan tabel Anda seperti biasa, dan itu tidak akan memotong bilah status!
sumber
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
sumber
self.topLayoutGuide.length
dariviewDidLayoutSubviews
akan mengacaukan tata letak tampilan anak.Pilih UIViewController pada storyboard Anda opsi hapus centang Perpanjang Tepi Di Bawah Bilah Atas. Bekerja untukku. :)
sumber
Ini adalah bagaimana menuliskannya dalam "Swift" Penyesuaian untuk jawaban @ lipka:
sumber
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
Untuk Xcode 7, hapus centang pada tanda centang 'tembus' untuk Bilah Navigasi berfungsi untuk saya.
sumber
Ini akan memperbaikinya untuk UITableViewController (tanpa angka ajaib). Satu-satunya hal yang saya tidak bisa memperbaikinya adalah jika Anda sedang melakukan panggilan telepon, dalam hal ini bagian atas tableView ditekan terlalu banyak. Jika ada yang tahu bagaimana menyelesaikannya, beri tahu kami.
sumber
Saya tidak tahu bagaimana Kosher itu, tetapi saya menemukan bahwa skema ini menggerakkan viewController ke bawah dan memberikan bar status dengan latar belakang yang solid:
Tentu saja, ganti
redColor
dengan warna apa pun yang Anda inginkan sebagai latar belakang.Anda harus secara terpisah melakukan salah satu swizzles untuk mengatur warna karakter / simbol di bilah status. Saya menggunakan
View controller-based status bar appearance = NO
danStatus bar style = Opaque black style
dalam plist, untuk melakukan ini secara global.Tampaknya bekerja, dan saya akan tertarik untuk mendengar ada bug atau masalah dengannya.
sumber
Jawaban chappjc bekerja sangat baik ketika bekerja dengan XIB.
Saya menemukan solusi terbersih ketika membuat TableViewControllers secara terprogram adalah dengan membungkus instance UITableViewController di UIViewController lain dan mengatur batasan yang sesuai.
Ini dia:
Cheers, Ben
sumber
Saya pikir pendekatan untuk menggunakan UITableViewController mungkin sedikit berbeda dari apa yang telah Anda lakukan sebelumnya. Ini berhasil bagi saya, tetapi Anda mungkin tidak menyukainya. Apa yang saya lakukan adalah memiliki pengontrol tampilan dengan tampilan wadah yang menunjuk ke UItableViewController saya. Dengan cara ini saya bisa menggunakan TopLayoutGuide yang disediakan untuk storyboard saya. Cukup tambahkan kendala pada tampilan wadah dan Anda harus dijaga baik untuk iOS7 maupun iOS6.
sumber
Saya akhirnya menggunakan satu tampilan tambahan dengan latar belakang yang diinginkan, ditambahkan setelah TableView dan ditempatkan di bawah bilah status:
Ini tidak terlalu cantik, tapi ini solusi yang cukup sederhana, jika Anda perlu bekerja dengan tampilan xib-less, dan keduanya iOS6 dan IOS7
sumber
Saya telah melakukan ini untuk tampilan Retina / Non-Retina sebagai
sumber
Solusi berikut ini berfungsi cukup baik dalam kode tanpa menggunakan konstanta ajaib, dan menyumbang pengguna mengubah kelas ukuran, misalnya melalui rotasi atau aplikasi berdampingan pada iPad:
sumber
Bekerja untuk swift 3 - Dalam viewDidLoad ();
Kode ini: 1. Mendapat ketinggian bilah status 2. Memberi bagian atas tabel melihat inset konten yang sama dengan tinggi bilah status. 3. Memberikan indikator gulir inset yang sama, sehingga muncul di bawah bilah status.
sumber
Bagi mereka seperti saya yang lebih suka tidak menanamkan mereka
UITableViewController
diUIViewController
coba ini:UITableViewController
Subkelas khusus dapat menambahkan tampilan mask ke superview tableView. Tambahkan topeng di viewDidAppear, dan hapus topeng di viewWillDisappear.sumber
Saya memiliki UISearchBar di bagian atas UITableView saya dan yang berikut berfungsi;
Bagikan dan nikmati ...
sumber
Saya berhasil dengan mengatur ukuran ke bentuk bebas
sumber
Solusi Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html bekerja untuk saya sebagai berikut. Saya memiliki UITableviewcontroller tunggal sebagai tampilan awal saya. Saya telah mencoba kode offset dan menanamkan dalam navcon tetapi tidak menyelesaikan transparansi statusbar.
Tambahkan Viewcontroller dan jadikan itu tampilan awal. Ini akan menunjukkan Anda Panduan Tata Letak Atas & Bawah yang penting.
Seret Tableview lama ke View di controller baru.
Lakukan semua hal untuk me-retrofit tabel ke controller baru:
Ubah file controller.h view lama Anda ke inherit / subclass dari UIViewController alih-alih UITableViewController.
Tambahkan UITableViewDataSource dan UITableViewDelegate ke .h controller .h.
Hubungkan kembali apa saja yang diperlukan di storyboard, seperti Searchbar.
Hal besar adalah mengatur kendala, seperti pada Tanya Jawab Apple. Saya tidak repot memasukkan bilah alat. Tidak yakin urutan pastinya. Tapi ikon merah muncul di Panduan Tata Letak, mungkin ketika saya membangun. Saya mengkliknya dan membiarkan Xcode menginstal / membersihkan kendala.
Lalu saya mengklik di mana-mana sampai saya menemukan batasan Ruang Vertikal dan mengubah nilai teratasnya dari -20 menjadi 0 dan berfungsi dengan baik.
sumber
Saya menggunakan UISplitViewController dengan navigasicontroller dan tableviewcontroller. Ini berfungsi untuk saya dalam tampilan master setelah mencoba banyak solusi di sini:
Ini mirip dengan solusi Hot Licks tetapi menerapkan subview ke navigationController.
sumber
sumber
Ini Swift 2.3. (Xcode 8.0) solusi. Saya telah membuat subkelas dari UITableView.
Inset konten harus selalu Nol (secara default). Saya mengaturnya Zero secara manual. Anda juga dapat menambahkan metode pemeriksaan yang membuat pemeriksaan dan jika itu selain apa yang Anda inginkan, dapatkan saja kotak yang benar. Perubahan hanya akan mencerminkan ketika tampilan tabel ditarik (yang tidak sering terjadi).
Jangan lupa untuk memperbarui TableView di IB Anda (di TableViewController atau hanya TableView di dalam ViewController Anda).
sumber
Saya menghadapi masalah ini di ios 11 tetapi tata letak sudah benar untuk ios 8 - 10.3.3. Untuk kasus saya, saya menetapkan Batas Ruang Vertikal ke Superview.Top Margin daripada Superview.Top yang berfungsi untuk ios 8 - 11.
sumber
Saya menemukan cara termudah untuk melakukan ini, terutama jika Anda menambahkan tampilan tabel di dalam bilah tab untuk pertama-tama menambahkan tampilan dan kemudian menambahkan tampilan tabel di dalam tampilan itu . Ini memberi Anda panduan margin atas yang Anda cari.
sumber
lihat semua solusi: proyek saya hanya menggunakan xib, jadi, solusi dengan storyboard tidak berfungsi untuk saya. self.edgesForExtendedLayout = UIRectEdgeNone; hanya berfungsi untuk pengontrol jika bilah navigasi terlihat. tetapi jika tampilan Anda hanya memiliki bilah status, itu tidak akan berfungsi. jadi saya menggabungkan dua conditons.
bantu ini berhasil.
sumber
Jika Anda juga perlu mendukung iOS 6, Anda harus memindahkannya secara kondisional. Artinya, di iOS 7 Anda harus memindahkannya 20 poin (baik melalui
frame
manipulasi atau menggunakan tata letak otomatis), dan di iOS 6 Anda membiarkannya. Saya tidak percaya Anda bisa melakukan ini di IB, jadi Anda harus melakukannya dalam kode.EDIT
Anda benar-benar dapat melakukan ini di IB, dengan menggunakan delta iOS6 / iOS7. Atur posisi Anda di iOS 7, lalu untuk iOS 6 atur delta Y ke -20points. Lihat pertanyaan SO ini untuk informasi lebih lanjut.
sumber
self.view.frame
danself.tableView.frame
, pada keduanyaviewWillAppear
danviewDidLoad
. Agar aman saya juga mengatursetContentNeedsDisplay
untuk memaksa redraw.