iOS8 - batasan secara ambigu menunjukkan ketinggian nol

100

Adakah yang punya ide bagaimana men-debug ini?

Peringatan hanya sekali: Mendeteksi kasus di mana batasan secara ambigu menyarankan ketinggian nol untuk tampilan konten sel tampilan tabel. Kami sedang mempertimbangkan keruntuhan secara tidak sengaja dan menggunakan ketinggian standar sebagai gantinya.

Baris memiliki ketinggian tetap seperti yang ditetapkan oleh

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}

Dan semua constraintstampak bahagia ...

Chris
sumber

Jawaban:

129

Memaksa ketinggian kembali dan perkiraan ketinggian membuat peringatan menghilang dalam kasus saya.

- (CGFloat)tableView:(UITableView *)tableView 
           estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

Solusi lain di mana Anda tidak memerlukan dua penggantian adalah dengan menggunakan metode self.tableView.rowHeight = 44;Anda loadViewatau init.

FBronner
sumber
1
Saya memiliki beberapa jenis baris di bagian dan hanya satu yang memiliki tinggi dinamis. maka itu tidak berfungsi
Raj Aggrawal
Jika kita menyetel tinggi default di xib / storyboard, kita tidak perlu menerapkan metode ini.
Satyam
77

Apa yang juga bisa dilakukan adalah menambahkan batasan vertikal dari atas dan ke bawah tampilan konten. Ini akan membuat tata letak otomatis senang (karena dia sekarang tahu cara menghitung sendiri ketinggian sel).

MonsieurDart
sumber
2
Ini berhasil untuk saya. Saya memeriksa semua sel kontainer dan memastikan setidaknya satu subview memiliki batasan "ruang atas ke wadah" dan "ruang bawah ke wadah".
Rog182
7
Itulah jawaban yang tepat untuk iOS 8 saat menggunakan sel tampilan tabel yang mengukur sendiri.
tsafrir
1
Apakah yang Anda maksud adalah batasan dari elemen di dalam tampilan konten ke bagian atas dan bawah tampilan konten?
Zack Shapiro
Saya mencoba ini tetapi saya terus mendapatkan peringatan kendala yang bertentangan.
Shirish Kumar
2
Pastikan Anda menambahkan batasan atas dan bawah ke tampilan konten sel, bukan sel itu sendiri. Jika Anda menambahkan batasan ke sel, kode akan tetap berfungsi tetapi akan mencoba menggunakan ketinggian 0.
frin
26

Jika Anda menggunakan batasan autoLayout dan UITableViewAutomaticDimension, kesalahan ini bukanlah masalah yang salah untuk dibuang dengan mengganti tinggi Anda dalam kode. Artinya, menentukan ketinggian sel secara otomatis tidak berfungsi karena Anda tidak memiliki batasan vertikal yang tepat yang diperlukan.

Jika Anda seperti saya dan mendapatkan kesalahan ini dan membutuhkan bantuan untuk mengidentifikasi sel mana yang menyebabkan kesalahan, Anda dapat menambahkan baris berikut tepat sebelum kembalinya metode 'heightforRowAtIndexPath' Anda.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Ini akan mencetak daftar panjang bagian dan baris, tetapi kesalahan akan segera muncul setelah sel tertentu yang menyebabkan kesalahan, dan Anda dapat dengan cepat mengidentifikasi sel mana yang menyebabkan masalah dan memperbaiki batasan Anda. Ini sangat membantu untuk sel statis. Mengganti tinggi dengan angka yang dimasukkan secara manual akan berfungsi jika Anda tidak menggunakan autoLayout dan ketinggian sel otomatis, tetapi pada dasarnya akan menonaktifkan fitur-fitur ini yang merupakan solusi yang sangat buruk jika itu adalah sesuatu yang Anda coba gunakan.

Jika Anda sebelumnya tidak menggunakan metode 'heightForRowAtIndexPath' tetapi ingin men-debug kesalahan ini tanpa membatalkan setelan UITableViewAutomaticDimension Anda, cukup tambahkan ini ke kode Anda:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}
pengguna2898617
sumber
Terima kasih banyak. Ini sangat membantu saya. Awalnya saya pikir, masalahnya ada pada sel tampilan tabel lain. Setelah debugging ternyata, masalah itu dengan yang lain.
akozin
Saya ingin melakukan ini, tetapi panjang, bagian, dan baris tidak teridentifikasi. Bisakah Anda menjelaskan apa yang seharusnya ada di Swift?
DrWhat
9

Tampaknya ada bug di XCode 6.1 yang menyebabkan masalah ini jika menggunakan tata letak otomatis dan Anda tidak menentukan nilai untuk Tinggi Baris untuk setiap Sel Tampilan Tabel, tetapi Anda membiarkan nilai "default". Cukup dengan mencentang kotak "Custom" di sebelah Row Height, untuk setiap sel, membuat peringatan hilang.

ltm
sumber
2
Jika Anda menggunakan sel self-sizing, Anda harus membiarkan tinggi baris disetel ke "default".
phatmann
1
Ini memecahkan peringatan itu. Tapi saya percaya itu hanya muncul saat menggunakan Sel Statis di TableView
MontiRabbit
1
@phatmann Masalah ini hanya muncul untuk sel statis sehingga sel tidak boleh mengukur diri sendiri.
ltm
@ltm dapatkah sel self-sizing tidak berguna, dalam sel statis, jika pengguna memiliki teks yang diperbesar mungkin? (Anda tahu, di bawah aksesibilitas di pengaturan iPhone)
Byron Coetsee
Saya pikir ini bukan bug, Ini mungkin masalah dengan batasan vertikal, mereka harus menjelaskan sepenuhnya ketinggian sel, setidaknya untuk tampilan tabel dengan dimensi otomatis.
juanjo
3

Ya, Anda mendapatkan semua batasan "senang" bahkan jika Anda hanya memiliki batasan horizontal untuk item dalam sel tampilan tabel. Saya memiliki masalah yang sama. Anda juga perlu menambahkan batasan vertikal. Dengan melakukan itu, peringatan itu akan hilang.

Juraj Antas
sumber
3

Batasan bisa menyenangkan untuk tujuan tata letak, tetapi tidak senang untuk tujuan tinggi baris otomatis. Tata letak yang menyenangkan berarti konten dapat ditata tanpa ambiguitas. Itu akan memenuhi pemeriksaan di Interface Builder.

Tata letak yang menyenangkan untuk tinggi baris otomatis berarti, selain di atas, Anda juga menyertakan pembatas ke bagian bawah sel.

Selengkapnya di sini: Mendeteksi kasus di mana batasan secara ambigu menunjukkan ketinggian nol

Woodster
sumber
3

Saya menggunakan Row Height 43 (atau <> 44) di inspektur ukuran Table View dan kesalahan menghilang. Menggunakan 44 saya mendapatkan kesalahan. Xcode versi 6.0.1.

- Jawaban ini telah dihapus oleh moderator, tolong jangan, itu memperbaiki masalah. Ini MENYELESAIKAN masalah untuk saya dan mungkin melakukannya untuk orang lain juga. Jadi bisakah Anda berbaik hati untuk tidak menghapusnya lagi.

teho
sumber
2

Saya tidak bisa menghapus peringatan, tetapi untuk membuat batasan bekerja saya mengatur, baru untuk iOS8, properti tableview estimatedRowHeightke ketinggian tetap, dan menghapus heightForRowAtIndexPathimplementasi.

amir
sumber
Jika tidak menghapus peringatan daripada itu sistem yang membuat untuk kendala yang hilang dan mengatur tinggi baris == ke properti cell.rowHeight. Peringatannya tentang properti penyembuhan otomatis, jika itu sembuh otomatis berarti masalahnya tidak ada?
Pedro Borges
2

Jika Anda mendapatkan peringatan itu, kemungkinan besar karena Anda menggunakan tata letak otomatis dan sel Anda tidak memiliki batasan di dalamnya.

Anda harus berhenti menggunakan tata letak otomatis atau menerapkan batasan yang secara jelas menentukan tinggi sel.

Anda dapat menonaktifkan tata letak otomatis di pembuat antarmuka dengan menghapus centang opsi "Gunakan Tata Letak Otomatis" di pemeriksa file di sebelah kanan.

Jika Anda memilih untuk menggunakan tata letak otomatis dan tinggi sel Anda sudah diperbaiki, menerapkan batasan yang sesuai semestinya mudah. Cukup tambahkan batasan ketinggian untuk sub-tampilan dari tampilan konten sel, dan terapkan batasan ruang vertikal antara sub-tampilan, dan antara sub-tampilan dan tampilan konten. Misalnya jika sel Anda memiliki satu label di dalamnya, ini akan berfungsi:

Batasan vertikal

  1. Batasan ruang vertikal antara bagian atas tampilan konten dan bagian atas label
  2. Batasan ketinggian label tetap
  3. Batasan ruang vertikal antara bagian bawah label dan bagian bawah tampilan konten

Batasan horizontal

  1. Batasan ruang horizontal antara tepi depan tampilan konten dan tepi depan label
  2. Batasan lebar label tetap
  3. Batasan ruang horizontal antara tepi belakang label dan tepi belakang tampilan konten
wrightak
sumber
Saya menggunakan batasan, dan mereka semua tampak senang, seperti yang disebutkan dalam pertanyaan.
Chris
Apakah itu kendala untuk subview dari tampilan konten sel? Seperti apa rupa mereka? Apakah mungkin Anda memiliki beberapa sel yang berbeda? Jika Anda mendefinisikan sel untuk memiliki ketinggian tetap menggunakan solusi Frederic Bonner, batasan akan diganti.
wrightak
1

Di Swift memaksa ketinggian kembali memperbaiki masalah saya:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}
Raja-Penyihir
sumber
1

Untuk perbaikan standar rawa, tidak ada kendala, tidak ada perkiraan ketinggian, atau masalah rekayasa berlebihan. Saya membuat proyek default, menghubungkan tableview tetapi lupa meletakkan delegasi ketinggian di pengontrol tampilan . Untuk membuat peringatan ini pergi, Anda memerlukan ini.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 44;
}

Di pengontrol tampilan tabel Anda.

latenitecoder
sumber
1

Saya menggunakan mapView di dalam uitableviewcell. Saya mengubah ketinggian tampilan peta menjadi 1/3 dari ukuran layar perangkat. Saya mendapat kesalahan yang sama. Saya memperbaiki kesalahan dengan menambahkan batasan yang hilang ke tampilan konten uitableviewcell.

1) Hapus batasan contentView.

2) Setel Reset ke konstanta yang Disarankan ke contentView.

masukkan deskripsi gambar di sini

3) Tambahkan kendala yang hilang - jika ada

4) Kami memastikan tampilan konten memiliki semua batasan yang diperlukan. masukkan deskripsi gambar di sini

AG
sumber
0

Dalam kasus saya, itu karena saya mendesain sel dengan xib, dan saya lupa menambahkan file xib itu ke target.

Setelah saya menambahkan file xib itu ke target, masalahnya hilang

onmyway133
sumber
0

Meskipun jawaban di halaman ini membahas penambahan batasan ketinggian atau secara manual mengembalikan rowHeights seperti 44 di heightForRowAtIndexPath menyebabkan peringatan menghilang, mereka tidak berguna karena ini adalah bug di Xcode yang terlihat setidaknya di Versi 6.3.2 (6D2105).

Jika Anda menyetel breakpoint di viewDidLoad, Anda akan melihat self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) meskipun Anda menentukan tinggi baris 44 di storyboard. Ini karena Apple salah mengasumsikan bahwa Anda menginginkan tinggi baris dinamis jika Anda membiarkan tinggi baris pada 44, karena mereka tidak memberikan bendera untuk Anda tentukan preferensi Anda.

Berikut beberapa solusi yang mungkin dan hasilnya:

  • Atur tinggi baris menjadi 43 atau 45 di storyboard (berhasil).

  • Kembalikan tinggi 44 secara manual di heightForRowAtIndexPath (berfungsi).

  • Tambahkan batasan ketinggian antara elemen UITableViewCell dan contentView-nya (berfungsi).

Sayangnya, solusi ini mengharuskan Anda untuk mengubah desain, menambahkan batasan yang tidak perlu, atau menambahkan kode yang tidak perlu untuk mengatasi bug. Saya mencoba (apa yang saya pikir) solusi paling sederhana:

  • Setel setiap tinggi UITableViewCell menjadi 44 (Kustom) di storyboard (gagal).

Saya sangat menginginkan solusi storyboard murni untuk ini, jadi akhirnya saya mencoba:

  • Tambahkan atribut runtime yang ditentukan pengguna ke UITableView di storyboard, dan beri nama UITableView dengan catatan tentang bagaimana rowHeight disetel sehingga pengembang di masa mendatang dapat menemukannya: (berfungsi):

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Bug ini terlalu umum dalam pengembangan iOS dan memaksa pengembang menghabiskan waktu berlebihan menimbang konsekuensi dari bagaimana solusi mereka akan memengaruhi pemeliharaan dalam jangka panjang.

Karena menemukan solusi konseptual yang benar yang dapat dipelihara dan tampaknya tidak dikaburkan begitu sulit dipahami, dan dengan asumsi bahwa Apple akan memperbaiki bug dan 44 akan menjadi tinggi baris default untuk masa mendatang, maka batasan atau ditentukan pengguna solusi atribut runtime mungkin yang paling mudah dipelihara.

Zack Morris
sumber
0

Ada dua hal penting yang terjadi di sini, menurut saya.

1) Sangat mudah untuk membuat pembatas menjadi salah jika Anda menekan ctrl + seret. Jadi, periksa kembali apakah Anda telah melakukannya dengan benar. Paling baik menggunakan baki di sisi kiri layar untuk menggambar batasan ini.

2) Alih-alih menentukan estimRowHeight di ViewDidLoad atau di tempat lain, gunakan metode delegasi

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Ini langsung memperbaiki masalah saya.

Greg
sumber
Mengapa Anda menggunakan override?
FractalDoctor
0

Saya juga melihat kesalahan ini saat menggunakan papan cerita universal atau xibs. Jika Anda lalai menentukan batasan yang tepat untuk kelas ukuran Any x Any, saya telah melihat kesalahan ini muncul.

Apple tampaknya telah memperbaiki ini untuk iOS9. Kesalahan hanya terjadi pada 8.4 untuk saya.

David Nix
sumber
0

Saya berputar-putar selama berhari-hari antara kesalahan ini dan kesalahan lain di mana batasan dibuat (tidak tahu di mana) yang bertentangan dengan batasan yang saya inginkan. Saya bahkan membuatnya berfungsi dalam satu contoh di mana setiap properti yang terlihat identik dengan yang lain. Satu-satunya solusi yang saya temukan adalah menggunakan atomic - buat file yang sama sekali baru dengan xib dan mulai lagi menghubungkan kembali outlet dengan menyalin-tempel kode lama. Ini mungkin bukan solusi terbaik, tetapi terkadang, jika masalahnya tidak terlihat, tidak banyak yang bisa dilakukan. Setidaknya, menjadi atom adalah cara yang baik untuk meninjau apa yang sedang terjadi.

DrWhat
sumber