iOS 7: UITableView menunjukkan di bawah bilah status

219

Layar pertama aplikasi saya adalah UITableViewControllertanpa bilah navigasi, yang berarti bahwa konten mengalir di bawah bilah status sehingga ada banyak tabrakan teks. Saya telah menyesuaikan kedua properti Under top barsdan Adjust scroll view insetsyang benar-benar menghentikannya agar tidak bergulir di bawah, tetapi dengan biaya menjaga bagian atas tampilan tabel di bawah. Saya telah berusaha mengatur UITableViewframe 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 barsdan Adjust scroll view, memaksa bingkai ke area baru.

Sebuah gambar bernilai ribuan kata: Aliran status bar di bawah

Nicholas Smith
sumber
2
Solusi cepat untuk menambahkan header 20-pixel kosong ke meja saat dijalankan di iOS 7.
EricS
@EricS: Saya sudah memiliki UITableViewheader di sana, itu juga mengalir di bawah status bar.
Nicholas Smith
Mengapa tidak menggunakan panduan tata letak otomatis di iOS 6? Berhasil.
Steven Fisher

Jawaban:

366

Bagi siapa pun yang tertarik mereplikasi ini, cukup ikuti langkah-langkah ini:

  1. Buat proyek iOS baru
  2. Buka storyboard utama dan hapus default / inisial UIViewController
  3. Seret yang baru UITableViewControllerdari Perpustakaan Objek
  4. Atur sebagai pengendali tampilan awal
  5. Beri makan tabel beberapa data uji

Jika 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:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Masalah ini bisa sangat membuat frustrasi, dan saya percaya ini adalah bug pada Apple, terutama karena itu muncul di pra-kabel mereka sendiri UITableViewControllerdari 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 UITableViewControlleradegan :
    Jika Anda ingin menyimpannya UITableViewControllerdi storyboard, tanpa secara manual menempatkannya di tampilan lain, Anda dapat menyematkan UITableViewControllerdalam UINavigationController(Editor> Tanamkan Di> Pengontrol Navigasi) dan hapus centang "Shows Navigation Bar" di inspektur . Ini menyelesaikan masalah tanpa perlu penyesuaian tambahan, dan itu juga melindungi UITableViewControlleradegan Anda di storyboard.

  • Menggunakan AutoLayout dan menyematkannya UITableViewke tampilan lain (saya percaya ini adalah bagaimana Apple ingin kita melakukan ini) :
    Buat yang kosong UIViewControllerdan seret UITableViewdi dalamnya. Kemudian, Ctrl-drag dari Anda UITableViewke 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.

marinosb
sumber
5
FYI, opsi 1 (menanamkan dalam kontroler nav) menghasilkan sel yang terlihat di belakang bilah status transparan ketika Anda menggulir melalui tabel.
RyanR
4
@RyanR Saya perhatikan itu juga, tapi saya pikir tidak apa-apa. Apple melakukan hal yang sama di tampilan tab yang dibuka Safari seluler, tab akan ditampilkan di bawah bilah status. Solusi pengendali navigasi adalah solusi paling sederhana, saya rooting untuk itu. Namun, bilah status yang tembus cahaya adalah ide yang bodoh.
Pride Chung
6
Ketika saya melakukan drag-control dari tableview ke atas, saya tidak pernah menemukan status bar. Tidak ada bilah status yang terlihat dalam tampilan, tidak yakin apa yang Anda maksud di sini ...
Jesse
4
Opsi 2 tidak lagi berfungsi di Xcode 5. Tindakan yang dijelaskan (ctrl-drag) seharusnya tidak pernah bekerja, karena itu dimiliki oleh sistem Outlet, tetapi bahkan jika Anda secara manual seret ke Pohon Adegan di sebelah kiri, panduan tata letak atas TIDAK BEKERJA (Seharusnya begitu, AFAICT - Saya yakin ini adalah bug utama lainnya di AutoLayout :( :()
Adam
3
@PrideChung terlihat bodoh saat menggunakan tajuk dengan tampilan tabel, tajuknya tetap di bagian atas dan elemen-elemen akan menghilang di belakang - dan muncul kembali di belakang bilah status transparan ...
Ixx
86

Jika Anda melakukan hal-hal secara programatik dan menggunakan UITableViewControllertanpa UINavigationControllertaruhan, taruhan terbaik Anda adalah dengan melakukan hal berikut di viewDidLoad:

Cepat 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Swift Sebelumnya

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

The UITableViewControllermasih akan bergulir di belakang status bar tetapi tidak akan berada di bawah ketika menggulir ke atas.

lipka
sumber
1
Anda dapat menambahkan tanda centang untuk versi OS> 7 dan mendukung OS yang lebih lama juga (tidak ada sisipan untuk mereka). Kalau tidak, ini bekerja dengan baik untuk tujuan saya.
SimpsOff
8
Nilai tinggi hardcoding bukan ide terbaik.
Maciej Kozieł
3
Ya, gunakan topLayoutGuidepanjang sebagai gantinya.
lipka
10
Saya akan menggunakan UIApplication.sharedApplication.statusBarFrame.size.heightbukan 20.
mojuba
Itu telah diperbarui ke UIApplication.share.statusBarFrame.size.height hari ini.
asetniop
23

Harap dicatat: Ini berfungsi untuk saya untuk konfigurasi berikut:

  • Tidak ada bilah navigasi di bagian atas layar (tampilan tabel memenuhi bilah status)
  • Tampilan tabel tidak dapat digulir

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:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Sumber (di bagian topLayoutGuide di bagian bawah hal.39).

Stunner
sumber
Menarik ... Saya bisa menyebutnya seperti itu dalam proyek saya tanpa masalah ... Saya mungkin memiliki struktur tata letak tampilan yang lebih sederhana daripada yang Anda lakukan. Saran Anda benar, saya akan mengubah jawaban saya.
Stunner
Saya kebetulan menemukan masalah ketika saya memutar aplikasi saya. Jika rotasi Anda dinonaktifkan, Anda kemungkinan tidak akan mengalami masalah.
Jeremy
Saya tidak memiliki rotasi diaktifkan di proyek saya dan saya menemukan masalah, tapi ya, masih bagus.
Stunner
1
Bagi siapa pun yang menerapkan pengontrol Kontainer mereka sendiri, ini adalah cara yang benar untuk menyesuaikan status atau bilah navigasi yang tumpang tindih!
Rafael Nobre
Jika Anda mengubah asal, tetapi bukan ketinggian tampilan yang dibatasi, bukankah bagian bawahnya akan dipotong oleh tepi bawah layar dengan jumlah yang Anda ubah asal? (jadi tidak mungkin untuk melihat beberapa baris piksel terakhir)
Tenfour04
20

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


  1. Seret ViewController kosong ke storyboard. Lihat Kontroler

  2. Seret objek UITableView ke dalam Tampilan. (Tidak UITableViewController). Posisikan di tengah menggunakan panduan tata letak biru.

Tampilan Tabel Gambar Tengah

  1. Seret UITableViewCell ke TableView. Ini akan menjadi sel reuse prototipe Anda, jadi jangan lupa untuk mengaturnya Reuse Identifier di bawah tab Attributes atau Anda akan mendapatkan crash.

Tambahkan Table View Cell Gunakan kembali Identifier

  1. Buat subkelas kustom Anda dari UIViewController, dan tambahkan <UITableViewDataSource, UITableViewDelegate>protokolnya. Jangan lupa untuk mengatur ViewController storyboard Anda ke kelas ini di Identity Inspector.

  2. Buat outlet untuk TableView Anda di file implementasi Anda, dan beri nama "tableView"

Buat Outlet tableView

  1. Klik kanan TableView dan seret dataSource dan delegasi ke ViewController Anda.

delegasi dataSource

Sekarang untuk bagian yang tidak terpotong ke status bar.

  1. Raih tepi atas Tampilan Tabel Anda dan pindahkan ke salah satu panduan tata letak biru putus-putus yang ada di dekat bagian atas

mengubah ukuran

  1. Sekarang, Anda dapat mengontrol drag dari Table View ke atas dan pilih Top Space to Top Layout Guide

Panduan Top Space to Top Layout

  1. Ini akan memberi Anda kesalahan tentang tata letak TableView yang ambigu, cukup Tambahkan Batasan yang Hilang dan Anda selesai.

Tambahkan Batasan yang Hilang

Sekarang Anda dapat mengatur tampilan tabel Anda seperti biasa, dan itu tidak akan memotong bilah status!

ErikAGriffin
sumber
11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1

Olzh
sumber
2
beralih <= ke> dan menghapus blok kosong jika
pfrank
1
Membaca self.topLayoutGuide.lengthdari viewDidLayoutSubviewsakan mengacaukan tata letak tampilan anak.
@OLzh saat melakukannya seperti yang Anda jelaskan, self.tableView tidak dapat menggulir.
DawnSong
8

Pilih UIViewController pada storyboard Anda opsi hapus centang Perpanjang Tepi Di Bawah Bilah Atas. Bekerja untukku. :)

pasak
sumber
Sayangnya, tidak berhasil untukku. UITableViewController sepenuhnya standar masih tumpang tindih status bar. Saya tidak berpikir status bar dianggap sebagai Top Bar. Hanya bilah nav dan bilah tab.
Andrew Duncan
Satu-satunya solusi yang bekerja untuk saya, ty. (Catatan Anda harus "mempersingkat" tampilan tabel di bawah bilah status di IB dan memperbarui batasan).
Martin Makarsky
Bekerja untuk saya di Xcode 8 dengan UITableViewController.
Edouard Barbier
8

Ini adalah bagaimana menuliskannya dalam "Swift" Penyesuaian untuk jawaban @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
uplearnedu.com
sumber
Bukankah swift diperbolehkan di sini?
uplearnedu.com
Satu-satunya solusi yang bekerja untuk saya, itu tidak membuat saya membuat UIVIewController
Shereef Marzouk
1
Ini kurang dari ideal karena menjaga inset teratas pada 20, bahkan dalam lanskap di mana tidak ada bilah status default di ios8
voidref
Variasi ini menangani konfigurasi apa pun dengan baik untuk saya:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix
5

Untuk Xcode 7, hapus centang pada tanda centang 'tembus' untuk Bilah Navigasi berfungsi untuk saya.

masukkan deskripsi gambar di sini

David T
sumber
Sederhana, tercepat, termudah, paling aman? larutan. Tidak tahu mengapa ini memiliki sedikit upvotes dibandingkan dengan yang lainnya.
Gruntcakes
3

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.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}
Harris
sumber
2

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:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Tentu saja, ganti redColordengan 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 = NOdan Status bar style = Opaque black styledalam plist, untuk melakukan ini secara global.

Tampaknya bekerja, dan saya akan tertarik untuk mendengar ada bug atau masalah dengannya.

Hot Licks
sumber
2

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:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Cheers, Ben

jam
sumber
1

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.

Phong Le
sumber
1

Saya akhirnya menggunakan satu tampilan tambahan dengan latar belakang yang diinginkan, ditambahkan setelah TableView dan ditempatkan di bawah bilah status:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Ini tidak terlalu cantik, tapi ini solusi yang cukup sederhana, jika Anda perlu bekerja dengan tampilan xib-less, dan keduanya iOS6 dan IOS7

lilislilit
sumber
1

Saya telah melakukan ini untuk tampilan Retina / Non-Retina sebagai

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}
MaxEcho
sumber
1

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:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}
qix
sumber
1

Bekerja untuk swift 3 - Dalam viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

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.

Wesh RaphLola
sumber
1

Bagi mereka seperti saya yang lebih suka tidak menanamkan mereka UITableViewControllerdi UIViewControllercoba ini:

UITableViewControllerSubkelas khusus dapat menambahkan tampilan mask ke superview tableView. Tambahkan topeng di viewDidAppear, dan hapus topeng di viewWillDisappear.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}
Lee Irvine
sumber
0

Saya memiliki UISearchBar di bagian atas UITableView saya dan yang berikut berfungsi;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

Bagikan dan nikmati ...

Sam T
sumber
0

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.

Jack Bellis
sumber
0

Saya menggunakan UISplitViewController dengan navigasicontroller dan tableviewcontroller. Ini berfungsi untuk saya dalam tampilan master setelah mencoba banyak solusi di sini:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Ini mirip dengan solusi Hot Licks tetapi menerapkan subview ke navigationController.

sfr14
sumber
Ini adalah satu-satunya jawaban yang berhasil bagi saya di iOS 8!
SamB
0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}
wajih
sumber
0

Ini Swift 2.3. (Xcode 8.0) solusi. Saya telah membuat subkelas dari UITableView.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

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

Darkwonder
sumber
0

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.

masukkan deskripsi gambar di sini

Pemberani
sumber
0

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.

masukkan deskripsi gambar di sini

NSCoder
sumber
-1

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.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

bantu ini berhasil.

phnix
sumber
-2

Jika Anda juga perlu mendukung iOS 6, Anda harus memindahkannya secara kondisional. Artinya, di iOS 7 Anda harus memindahkannya 20 poin (baik melalui framemanipulasi 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.

Scott Berrevoets
sumber
Sayangnya, pengaturan bingkai tidak akan mengubahnya.
Nicholas Smith
Apa yang tidak berhasil? Tampilan tabel tidak bergerak ke bawah?
Scott Berrevoets
Ya, itu tetap di posisi yang sama. Saya sudah mencoba self.view.framedan self.tableView.frame, pada keduanya viewWillAppeardan viewDidLoad. Agar aman saya juga mengatur setContentNeedsDisplayuntuk memaksa redraw.
Nicholas Smith
Apakah tata letak otomatis diaktifkan?
Scott Berrevoets
Ya, ini pembayaran otomatis dan Storyboard.
Nicholas Smith