UITableView dimulai dengan offset di iOS 7

115

Saya telah menyeret UITableView polos ke UIViewController di iOS 7.

Sekarang ada ruang offset vertikal sebelum sel pertama dimulai. Bagaimana cara menyingkirkannya? Saya ingin baris pertama lebih dekat ke tepi atas tempat UITableView sebenarnya dimulai. Saya tidak meminta offset besar bukan?

masukkan deskripsi gambar di sini

Ada ide?

pengguna798719
sumber
43
Saya dibantu oleh yang berikut: YouStoryboard.storyboard> YouViewController> Attributes inspector> Hapus centang - Sesuaikan insets tampilan gulir.
Alexander
17
btw, Anda dapat mengambil tangkapan layar Simulator iOS menggunakan tombol Command + S
Hemang
@Alexander: Saya juga terbantu dengan saran Anda, namun menghapus centang pada ExtendEdges.UnderTopBars menyebabkan lagi ruang offset vertikal muncul. Saya tidak yakin apakah itu salah satu dari (banyak?) Bug di Xcode6, tetapi masalah ini membuat saya pusing sesekali!
iOS-Coder

Jawaban:

81

Secara default pengontrol tampilan tabel akan meletakkan konten di bawah bilah navigasi sehingga Anda dapat menggulir konten di bawahnya dan melihatnya, dalam keadaan kabur, di bawah bilah navigasi / bilah alat.

Sepertinya Anda memposisikannya pada 44 (mungkin 64) px untuk memindahkannya dari bawah bilah navigasi, tetapi itu sudah mengimbangi ini sehingga Anda mendapatkan celah yang besar.

Pergi ke storyboard / xib di IB dan hapus centang konten acara di bawah barang bilah navigasi.

Cocoadelica
sumber
6
Maaf, bagaimana komentar tentang NDA di iOS7 tidak relevan? Ini adalah forum untuk membantu orang.
Cocoadelica
Dalam Xcode Versi 5.1 di Viewcontroller untick extended edge> Di bawah bilah atas untuk menghapus inset konten UITableView teratas
Emel Elias
3
Jadi, di mana konten acara di bawah nav bar thigo? Saya tidak dapat menemukannya.
Anup Kattel
10
@FrankGorman di Xcode 5.1.1 ada opsi di storyboard untuk pengontrol tampilan tertentu Adjust Scroll View insets, hilangkan tanda centang.
korat prashant
1
hai @koratprashant. komentar yang sangat berguna.
KDeogharkar
107

Baru iOS 7 pelaksanaan UIViewController memiliki seperangkat pilihan baru yang memungkinkan pengembang untuk memilih jika sistem akan secara otomatis menambahkan insets untuk UIScrollView , UITableView dan derivasi.

Untuk menonaktifkan perilaku ini, hapus centang pada kotak ini untuk semua UIViewControllers yang Anda inginkan di InterfaceBuilder, di UIViewController selected object inspector:

Lihat Controller Inspector

Untuk lebih jelasnya:

  1. Kirimkan aplikasi iOS 7 Anda hari ini.
  2. Panduan Transisi UI iOS 7> Penampilan dan Perilaku
xudre
sumber
Terima kasih! Kamu menyelamatkanku.
rsc
68

Dari panduan transisi iOS7:

Jika Anda tidak ingin insets konten tampilan gulir disesuaikan secara otomatis, setel secara otomatisAdjustsScrollViewInsets ke NO. (Nilai default dari AutomaticAdjustsScrollViewInsets adalah YA.)

   self.automaticallyAdjustsScrollViewInsets = NO;
sovanlandy.dll
sumber
9
Ini juga dapat disetel di XCode pada inspektur atribut. Hapus centang pada Adjust Scroll View Insetskotak centang untuk tata letak pengontrol tampilan.
Andrew
1
Jika Anda memuat UIViewController secara terprogram (tanpa menggunakan XIB), ini berfungsi seperti pesona. Setel automaticallyAdjustsScrollViewInsets = NOdi pengontrol tampilan.
KabraBoja
Ini untukku. Membingungkan karena TableView saya berada di dalam tampilan kontainer dan awalnya tampak baik-baik saja. Tapi itu kacau saat muncul kembali dari pengontrol tampilan lain.
n13
Bagus! Hemat saya banyak waktu!
inix
34

saya memiliki masalah yang sama, setelah menutup viewController, contentOffset dari tableView saya diubah menjadi (0, -64).

solusi saya agak aneh, saya mencoba semua jawaban lain tetapi tidak berhasil, satu-satunya hal yang memperbaiki masalah saya adalah mengganti posisi tableView di pohon kontrol dari .xib

itu adalah kontrol pertama di Tampilan induk seperti ini:

sebelum

Saya memindahkan tableView tepat setelah ImageView dan berhasil:

setelah

tampaknya menempatkan tampilan tabel di posisi pertama menyebabkan masalah, dan memindahkan tampilan tabel ke posisi lain memperbaiki masalah tersebut.

PD Saya tidak menggunakan autoLayout juga storyboard

semoga ini bisa membantu seseorang!

Chuy47
sumber
Saya memperhatikan hal yang sama! Saya tidak meletakkan tampilan tambahan, tetapi mengimbangi celah yang sederhana dengan memindahkan UITableView -44 ke atas. Di IB sepertinya saya harus pindah -64px, tetapi dalam runtime -64px menyebabkan tablview overlay bar navigasi dan -44px OK. Saya tidak bisa menjelaskannya. Saya menemukan masalah ini dalam tampilan popover iPad, ketika saya tidak melihat masalah serupa di papan cerita iPhone.
Mike Keskinov
Masalah ini muncul bahkan dengan tampilan antarmuka. jika tampilan yang ditampilkan di antarmuka pengguna ditempatkan tidak dalam urutan yang sama.
Rinku
2
Saya mengalami masalah yang sama hari ini, dengan XCode 6.1. Kapur lagi 2-3 jam terbuang, mencoba mengatasi bug Apple ...
Mike Gledhill
3
Ini sangat membantu dan membutuhkan lebih banyak perhatian! Tidak ada jumlah mengutak-atik pengaturan pengontrol tampilan atau inset / offset konten yang membantu, tetapi mengubah urutan tampilan di storyboard memecahkan masalah bagi saya.
Kaleb
1
Apple, maksudku ... WTF? Terima kasih kawan, ini juga memperbaiki papan cerita dengan tata letak otomatis.
Borzh
30

itu menyelesaikan masalah saya yang serupa:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Alex
sumber
1
Anda harus memeriksa dari versi sistem dengan cara ini menggunakan:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes
Ini berfungsi untuk saya untuk masalah jarak yang saya alami tetapi sekarang pemintal kontrol tarik-untuk-menyegarkan saya muncul sebagian dikaburkan & di bawah menu teratas saya. Adakah yang melihat ini juga? Ada solusi?
Nick
@ nickv2002 coba buat tableView secara terprogram
Alex
Saya mencoba semua solusi lain tetapi hanya yang ini yang berhasil untuk saya
DanielR
13

Coba gunakan ini

tableView.separatorInset = UIEdgeInsetsZero;

Tentunya, jika Anda mendukung apa pun yang kurang dari iOS7, Anda perlu memastikan bahwa objek merespons pemilih ini sebelum memanggilnya.

David Attaie
sumber
4
tidak yakin mengapa ini dipilih ... separatorInset hanya mengubah garis jarak antar sel yang disisipkan dari tepi tampilan. Pertanyaannya menanyakan tentang ruang di atas dan di bawah sel
Rembrandt Q. Einstein
Gambarnya menyesatkan, tetapi pencarian Google yang umum untuk masalah margin menghasilkan halaman ini.
Akankah
9

Serius, berubah contentOffsetbukanlah solusinya. Anda hanya memperbaiki masalah dan tidak memperbaiki penyebabnya. Saya telah menghadapi masalah yang sama dan ternyata tableView yang dikelompokkan memiliki padding di bagian atas. Dalam kasus saya, mengatur tipe menjadi polos telah melakukan triknya.

Mudah-mudahan bisa menghemat beberapa menit. Z.

Zoltán
sumber
1
saya sangat merindukannya, senang saya menemukan jawaban Anda, UPVOTE
AamirR
8

Dengan iOS 9, tidak ada jawaban lain dari halaman ini yang berfungsi untuk saya (misalnya, hapus centang pada kotak di Storyboard, setel automaticallyAdjustsScrollViewInsetske NO).

Solusi saya, saya benar-benar tidak puas adalah ini:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Garis yang sama viewWillAppearatau viewDidLoadtidak efektif.

Henry kotor
sumber
Ini harus menjadi satu-satunya jawaban untuk uitableviewcontroller iOS 9 .... sungguh, tidak ada lagi yang membantu, dan saya sudah mencoba semuanya, di mana Anda menemukan ini, atau bagaimana Anda mengetahuinya? banyak 10x
Erez
Tidak Adjust Scroll View insetsmencentang kotak centang berfungsi untuk iOS 9.
Adam
Sesuaikan insets Tampilan Gulir tidak berfungsi untuk saya ada solusi lain?
Yogesh Patel
5

Terkadang, saya mendapatkan 64celah ketinggian di bagian atas Tampilan Tabel saya saat UIViewControllertertanam di dalam Pengontrol Navigasi.

masukkan deskripsi gambar di sini

Di masa lalu, saya hanya akan membuat ulang semuanya, berharap kendala menjadi benar setelah batu tulis yang bersih.

TIL: Jika Anda tidak ingin membuat batasan vertikal ke Top Layout Guide, Anda dapat menahan Optiontombol untuk mengakses Container Margin.

masukkan deskripsi gambar di sini

Kemudian pastikan Top Space to Superviewkonstanta disetel ke 0. Setidaknya ini berhasil bagi saya.

masukkan deskripsi gambar di sini

Robert Chen
sumber
1,5 tahun kemudian, tapi itu menyelesaikan malam saya. Terima kasih!
asp_net
4

Ini berhasil untuk saya:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
yeahdixon
sumber
2

Jika Anda menambahkan UIView kosong sebelum UITableView (atau tampilan apa pun dapat digulir seperti ScrollView dan TextView), Anda bisa beruntung.

Kastor
sumber
1

Saya memiliki UITableViewController yang disematkan dalam tampilan kontainer. Untuk menyingkirkan 64 titik ruang vertikal yang tidak diinginkan, saya perlu menghapus centang pada 'Sesuaikan Insets Tampilan Gulir' di Interface Builder dan menyetel contentInset UITableView di viewWillAppear UITableViewController saya seperti di bawah ini.

Ukuran ruang vertikal tampaknya cocok dengan tinggi bingkai bilah navigasi dan offset y. Masalahnya hanya terjadi di iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}
pengguna2067021
sumber
1

Di Xamarin iOS, saya mengalami masalah ini pada UITableViewController latar belakang tepat setelah dialog modal latar depan ditutup. Dalam proses pindah ke latar depan, UITableViewController memiliki set insets (di suatu tempat oleh iOS):

Kelas ini menyelesaikannya

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}
Herman Schoenfeld
sumber
1

Dari waktu ke waktu saya kembali ke situasi yang mengerikan ini, dan saya perhatikan bahwa itu masih belum diketahui. Jadi, untuk kenangan masa depan ...

Akhir-akhir ini, saya sedang memperbaiki solusi ini.

  1. Tambahkan subview di bagian atas UITableView, dengan tinggi piksel nol. Bekerja dengan Autolayout atau tanpa.
  2. Jika saya merasa yakin :-) Saya menghapus tampilan palsu ini, memperbaiki batasan di atas, dan secara ajaib berhasil.

Jangan tanya saya kenapa, saya masih berpikir itu bug jauh di UIKit.

klauslanza.dll
sumber
0

Jika Anda membuka storyboard, Anda dapat mengubah offset dengan memilih tabel dan di bawah bagian Tampilan Tabel di inspektur Atribut Anda cukup mengubah Insets Pemisah di kiri menjadi 0.

Nyctitropist
sumber
0

Saya pikir solusi sebenarnya adalah mengatur batasan atas dan bawah Anda pada tampilan tabel sama dengan topMargin dan bottomMargin. Bukan panduan tata letak atas dan panduan tata letak bawah. Ini memungkinkan Anda untuk menjaga secara otomatisAdjustsScrollViewInsets menjadi true.

Dan
sumber
0

Solusi Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
hhamm
sumber
0

Jika Anda menyematkan TableViewController Anda di NavigationController atau ContainerView You have to constraint to margins instead of top Layout guide in Storyboard,. Check constraint to margins when you are doing the constraintsTidak ada cara lain yang berhasil untuk saya. Saya tidak bisa berkomentar jadi saya hanya mengulangi jawaban Robert Chens.

pengguna3296487
sumber
0

Saya mencoba beberapa jawaban. Mengubah pengaturan di storyboard menyebabkan masalah riak dengan menu overlay yang muncul dari kiri.

Saya hanya memiliki UIViewController kosong di storyboard, jika tidak, semuanya dihasilkan secara terprogram.

Saya memiliki masalah yang sama dengan UITableView di dalam UIView di dalam UIViewController. Yakni, header bagian mulai terlalu jauh ke bawah saat UIViewController disematkan di Pengontrol Navigasi. Tanpa pengontrol navigasi, semuanya berfungsi dengan baik.

Untuk memperbaiki masalah ini saya membuat sebuah UILabel dan dengan batasan ditempatkan batasan bawah UILabel = batasan teratas dari UIView (sehingga tidak muncul di layar. Sekarang dengan kontrol tambahan (Label baru) TableView berperilaku dengan baik.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
john
sumber
0

Saya memiliki masalah yang sama di iOS 11 dan xib, UITableviewController dan saya menyelesaikannya seperti di bawah ini

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
dobiho
sumber