Mendeteksi kasus di mana batasan secara ambigu menunjukkan ketinggian nol

120

Setelah memperbarui ke Xcode 6.1 beta 2 ketika saya menjalankan aplikasi saya yang berisi sel tableview, asisten debug mengatakan:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Sebelumnya, ketika saya menggunakan Xcode 5 pada proyek ini, saya akan mendapatkan beberapa kesalahan tetapi itu telah hilang sejak saya meningkatkan. Saya tidak memiliki kesalahan atau peringatan lain sekarang. Saya sudah mencoba menyesuaikan ukuran semua sel tableview dan juga mencoba menggunakan ketinggian standar tetapi saya masih mendapatkan peringatan yang sama:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Saya juga telah membaca semua topik serupa tentang ini tetapi tidak ada solusi mereka yang membantu. Saat saya menguji aplikasi dengan simulator, aplikasi berjalan dengan baik kecuali gambar yang seharusnya ada di sel tableView tidak ada.

David E
sumber
2
Saya mendapatkan kesalahan yang sama untuk sel tampilan koleksi. Apa yang saya lakukan untuk ini. Ada saran.
python
Mungkin Anda harus memeriksa apakah Anda telah menambahkan file xib ke target stackoverflow.com/a/26870331/1418457
onmyway133
1
kemungkinan duplikat iOS8 - kendala secara ambigu menyarankan ketinggian nol
Max MacLeod
Ini terjadi pada saya di iOS 8.1, tetapi tidak lagi di iOS 8.4. Jika Anda menentukan tingginya, saya kira itu hanya bug Xcode.
samwize

Jawaban:

126

Tiga hal telah berhasil membungkam peringatan ini sejauh ini. Anda dapat memilih yang paling nyaman untuk Anda. Tidak ada yang cantik.

  • Untuk menyiapkan tinggi sel default di viewDidLoad

    self.tableView.rowHeight = 44;
  • Buka papan cerita dan ubah tinggi baris pada tampilan tabel Anda menjadi sesuatu yang berbeda dari 44.

  • Untuk mengimplementasikan metode delegasi tableview heightForRowAtIndexPath

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

Aneh.

Viktor Kucera
sumber
Saya juga mencoba menggunakan metode Anda tetapi saya perlu menambahkan @property untuk rowHeight tetapi saya tidak tahu jenis objek yang benar untuk digunakan
David E
Saya mungkin tidak mendapatkan catatan Anda, tetapi rowHeight adalah properti UITableView. Cukup hubungkan meja Anda ke beberapa outlet dan hanya itu.
Viktor Kucera
4
Ini karena jika Anda menyimpan nilai 44pt di IB, itu akan menganggap Anda ingin menggunakan sel ukuran sendiri. stackoverflow.com/questions/25888126/… (tapi, ya, ini memang perilaku yang aneh)
Guillaume Algis
Jadi ternyata saya memiliki dua metode viewDidLoad dan saya salah memasukkannya self.tableView.rowHeight = 44;. Kesalahannya hilang! terima kasih
David E
Terima kasih Guillaume Algis karena telah memperjelas ini. Ini masih sangat menyeramkan.
Viktor Kucera
216

Anda menemukan efek samping dari fitur baru yang fantastis di Tampilan Tabel iOS8: Ketinggian Baris Otomatis.

Di iOS 7, Anda memiliki baris dengan ukuran tetap (diatur dengan tableView.rowHeight), atau Anda akan menulis kode untuk menghitung tinggi sel Anda dan Anda akan mengembalikannya tableView:heightForRowAtIndexPath. Menulis kode untuk menghitung tinggi sel bisa jadi sangat rumit jika Anda memiliki banyak tampilan di sel Anda dan Anda memiliki ketinggian berbeda untuk dipertimbangkan pada ukuran font yang berbeda. Tambahkan Dynamic Type dan prosesnya sangat menyebalkan.

Di iOS 8, Anda masih dapat melakukan hal di atas, tetapi sekarang tinggi baris dapat ditentukan oleh iOS, asalkan Anda telah mengkonfigurasi konten sel Anda menggunakan Tata Letak Otomatis. Ini adalah keuntungan besar bagi pengembang, karena saat ukuran font dinamis berubah, atau pengguna mengubah ukuran teks menggunakan Pengaturan Aksesibilitas, UI Anda dapat beradaptasi dengan ukuran baru. Ini juga berarti jika Anda memiliki UILabel yang dapat memiliki beberapa baris teks, sel Anda sekarang dapat tumbuh untuk mengakomodasi baris tersebut saat sel membutuhkannya, dan menyusut jika tidak diperlukan, sehingga tidak ada spasi kosong yang tidak perlu.

Pesan peringatan yang Anda lihat memberi tahu Anda bahwa tidak ada batasan yang cukup di sel Anda untuk Tata Letak Otomatis untuk menginformasikan tampilan tabel ketinggian sel.

Untuk menggunakan tinggi sel dinamis, yang, bersama dengan teknik yang telah disebutkan oleh poster lain, juga akan menghilangkan pesan ini, Anda perlu memastikan sel Anda memiliki batasan yang memadai untuk mengikat item UI ke bagian atas dan bawah sel. Jika Anda pernah menggunakan Tata Letak Otomatis sebelumnya, Anda mungkin terbiasa menyetel batasan Atas + Utama, tetapi tinggi baris dinamis juga memerlukan batasan bawah.

Layout pass berfungsi seperti ini, yang terjadi tepat sebelum sel ditampilkan di layar, dengan cara tepat waktu:

  1. Dimensi konten dengan ukuran intrinsik dihitung. Ini termasuk UILabels dan UIImageViews, yang dimensinya masing-masing didasarkan pada teks atau gambar UII yang dikandungnya. Kedua tampilan ini akan menganggap lebarnya diketahui (karena Anda telah menyetel batasan untuk tepi belakang / depan, atau Anda menyetel lebar eksplisit, atau Anda menggunakan batasan horizontal yang akhirnya memperlihatkan lebar dari sisi ke sisi). Misalkan sebuah label memiliki paragraf teks ("jumlah baris" disetel ke 0 sehingga akan otomatis terbungkus), itu hanya boleh menyilang 310 poin, jadi tinggi 120pt ditentukan pada ukuran font saat ini.

  2. UI diatur sesuai dengan batasan pemosisian Anda. Ada batasan di bagian bawah label yang menghubungkan ke margin bawah sel. Karena label telah berkembang menjadi 120 poin, dan karena terikat ke bagian bawah sel oleh pembatas, label harus mendorong sel "ke bawah" (meningkatkan tinggi sel) untuk memenuhi pembatas yang bertuliskan "bagian bawah jarak label selalu standar dari bagian bawah sel.

Pesan kesalahan yang Anda laporkan terjadi jika batasan bawah itu hilang, dalam hal ini tidak ada yang "mendorong" bagian bawah sel menjauh dari bagian atas sel, yang merupakan ambiguitas yang dilaporkan: tanpa ada yang mendorong bagian bawah bagian atas, sel itu runtuh. Namun Tata Letak Otomatis juga mendeteksinya, dan kembali menggunakan tinggi baris standar.

Untuk apa nilainya, dan sebagian besar memiliki jawaban bulat, jika Anda menerapkan tinggi baris dinamis berbasis Tata Letak Otomatis iOS 8, Anda harus menerapkan tableView:estimatedHeightForRowAtIndexPath:. Metode perkiraan itu bisa menggunakan nilai kasar untuk sel Anda, dan itu akan dipanggil saat tampilan tabel pertama kali dimuat. Ini membantu UIKit menggambar hal-hal seperti scrollbar, yang tidak dapat ditarik kecuali jika tampilan tabel mengetahui berapa banyak konten yang dapat digulir, tetapi tidak memerlukan ukuran yang benar-benar akurat, karena ini hanya scrollbar. Ini memungkinkan penghitungan tinggi baris yang sebenarnya ditunda hingga saat sel dibutuhkan, yang kurang intensif secara komputasi dan memungkinkan UITableView Anda disajikan lebih cepat.

Woodster
sumber
3
Ini adalah penjelasan yang bagus tentang akar alasan peringatan ini. Terima kasih banyak atas waktu Anda, Woodster!
Jempol Emas
4
Seperti yang dikatakan Woodster, saya melewatkan bagian .Bagian bawah kendala. Ketika ditambahkan, masalah saya terpecahkan.
Jempol Emas
Setelah mencoba hampir 20 hal, ini adalah satu-satunya yang berhasil!
Julio Rodrigues
Pria ini berhasil! Dia layak dan suka dan ini harus menjadi jawaban yang diterima. +1
Karibia
1
Lihat jawaban stackoverflow.com/a/29565073/4080860 ini untuk mengetahui sel apa yang tidak memiliki batasan.
hhanesand
11

Saya mengalami masalah ini setelah membuat kustom UITableViewCelldan menambahkan subview saya ke sel alih-alihnya contentView.

ABakerSmith
sumber
10

Untuk mengatasi ini tanpa metode terprogram, sesuaikan tinggi baris tampilan tabel di Size Inspector dari storyboard.

masukkan deskripsi gambar di sini

Anconia
sumber
Solusi terbaik bagi saya karena menggunakan storyboard, bukan baris untuk kode.
zyc
6

Ini adalah masalah tata letak otomatis. Pastikan subview Anda memiliki semua batasan. Bagi saya, batasan bawah tidak ada untuk Label Judul di sel. Ketika saya menambahkan itu, peringatan itu hilang dan semuanya muncul dengan sempurna.

Alok
sumber
Tidak tahu mengapa ini mendapat suara negatif, karena ini adalah jawaban yang sangat bagus. Lihat di sini untuk bantuan dalam mencari tahu sel mana yang mengalami masalah dalam
penataan
5

Cukup aktifkan Sel Tampilan Tabel Ukuran Sendiri

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& pastikan Anda menambahkan batasan di semua sisi UITableViewCellsebagai-

masukkan deskripsi gambar di sini

Mendongkrak
sumber
Sebenarnya, peringatan itu hilang saat saya menonaktifkan sel tableview sizig mandiri.
diuji
@turingtested Anda harus mengaktifkan sel tableview self sizing untuk memberikan dukungan pada berbagai perangkat.
Jack
Setuju, tapi harap baca pertanyaan aslinya. Yang saya maksud adalah solusi yang Anda sarankan tidak berhasil, setidaknya tidak untuk saya.
diuji pada
FYI UITableViewAutomaticDimensiontelah diubah namanya menjadiUITableView.automaticDimension
atineoSE
5

Jika Anda menggunakan sel statis atau sel dinamis, cukup tambahkan beberapa tinggi baris ke tampilan tabel di tabel inspektur dan hapus centang otomatis ke sisi kanan tinggi baris, itu saja u akan berhenti mendapatkan peringatan ini.masukkan deskripsi gambar di sini

Amit Verma
sumber
Saya menemukan kebalikannya lebih efektif: tetapkan perkiraan ketinggian yang eksplisit, dan biarkan tinggi baris itu sendiri menjadi otomatis.
NRitH
4

Saya mendapat peringatan ini hari ini. Inilah yang membuatnya hilang untuk saya (di pembuat antarmuka)

1. Atur bidang tinggi baris untuk tampilan tabel ke sesuatu selain 44 2 Atur bidang tinggi baris untuk sel tableView ke sesuatu selain 44

Saya tidak perlu mengubah kode apa pun

humblePilgrim
sumber
3

Dalam kasus saya, saya sedang membangun sel secara terprogram dan terus mendapatkan kesalahan ini.

Saya menambahkan subviews dan kendala dalam UITableViewCell's initmetode seperti ini:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Saya memecahkan masalah dengan menambahkannya ke sel contentViewsebagai gantinya:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
gohnjanotis
sumber
1
Selalu tambahkan subview ke contentView, bukan UITableViewCelllangsung.
dinesharjani
3

Setel perkiraan tinggi baris ke nol dan peringatan menghilang:

masukkan deskripsi gambar di sini

TruMan1
sumber
Masalah sebenarnya adalah kendala yang hilang di suatu tempat. Anda mungkin memasukkan sesuatu secara vertikal daripada menyetel batasan atas / bawah
TruMan1
1

Saya juga mengalami peringatan ini saat pindah ke Xcode 6 GM. Saya hanya mendapatkan peringatan ketika saya memutar perangkat kembali ke posisi semula.

Saya menggunakan UITableViewCells kustom. Tampilan tabel storyboard diatur ke ukuran kustom saya (100.0 dalam kasus saya). Sementara sel tabel dirender dengan benar seperti pada rilis sebelumnya, saya tidak suka pesan peringatan.

Selain ide di atas, saya menambahkan ini

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

Tampilan layar ... merespons rotasi dan tidak ada lagi pesan peringatan.

DannyJi
sumber
Jadi saya telah mencoba menggunakan metode Anda menggunakan baris yang Anda berikan kepada saya tetapi saya masih menemukan kesalahan yang sama. Saya juga belum menggunakan rotasi di aplikasi saya.
David E
1

Di xcode 6.0.1 saya telah menghapus peringatan ini yang menentukan tinggi baris menggunakan:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}
Fantini
sumber
1

Jika Anda telah membuat TableViewCell Kustom untuk tableView, pastikan Anda telah memberikan batasan bawah dan atas ke sel Anda, Anda juga bisa mendapatkan pesan ini jika subview Anda di dalam sel kustom disejajarkan di tengah Y yang tidak akan memunculkan pesan kesalahan tetapi akan mengacaukan up dengan mengidentifikasi ketinggian baris untuk tableview pada gilirannya seperti pada Gambar yang telah saya lampirkan, di sini kita memiliki kendala atas dan bawah

Saat Anda membuat Sel Kustom untuk tableView, Anda harus menentukan ketinggian baris atau batasan atas dan bawah tertentu untuk subview sel kustom Anda di dalam sel (mis. Label di sel kustom seperti pada gambar di bawah)

Tetapi jika ini tidak berhasil, Anda dapat mencoba mengatur tinggi baris untuk sel Anda alih-alih menjadi otomatis seperti pada gambar ini

Tetapi pastikan jika Anda mematikan centang otomatis itu, Anda harus menyesuaikan ukuran baris Anda untuk perubahan secara terprogram yang bisa dilakukan secara otomatis.

lubang monster
sumber
0

Di papan cerita, atur cell Row heightbidang dengan nilai yang sama seperti Row heightditableView (keduanya dengan nilai yang sama bekerja untuk saya).

Jika Anda menambahkan heightForRowAtIndexPathfungsi ke kode Anda, ini dapat menyebabkan masalah kinerja karena akan dipanggil untuk setiap sel jadi berhati-hatilah.

Daniel Gomez Rico
sumber
0

Anda juga dapat melihat pesan ini jika satu-satunya pembatas Anda disetel untuk meratakan semua item secara vertikal dan Anda tidak memiliki / ingin ketinggian yang ditentukan untuk sel. Jika Anda menyetel batasan atas / bawah pada item, peringatan akan hilang.

Mikha Montoya
sumber
0

Saya mengalami masalah ini saat label dan tampilan saya di tableViewCell kustom dibatasi ke customCell, bukan Tampilan Kontennya. Ketika saya membersihkan batasan dan menghubungkannya ke sel Tampilan Konten, masalah telah terpecahkan.

Marija Zivkovic
sumber
0

Saya mendapat pesan error yang sama, pastikan semua outlet Anda valid seperti table view dan tableview Constraints

Gulz
sumber
0

Jika Anda membuat kalkulasi ketinggian dinamis,

  • Anda harus memiliki semua elemen yang ditautkan satu sama lain dalam batasan seperti atas dan bawah.
  • Anda pasti harus memiliki batasan bawah yang terkait dengan elemen di bagian bawah sel Anda
S. Mert
sumber
0

Saya juga memiliki masalah serupa untuk sel tableview kustom yang memiliki tinggi baris dinamis. Ketinggian dinamis tidak tercermin dan mendapat peringatan yang sama di konsol. Solusinya adalah Menambahkan subview ke sel alih-alih contentView. BTW, saya telah membuat subview secara terprogram.

Srinivas G
sumber
0

Saya memiliki masalah ini TableViewCelldi mana batasan ditetapkan pada inisialisasi tetapi di mana konten sel dimuat sesudahnya, ini berarti mesin autolayout tidak dapat menentukan ketinggian. Solusi lain di sini tidak berfungsi karena saya membutuhkan tinggi selUITableView.automaticDimension .

Saya baru saja menambahkan batasan ekstra ke sel:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)
Leon
sumber
0

Saya mendapat Peringatan ini hari ini Yang saya lakukan hanyalah menambahkan satu baris ekstra ke kode saya

tableView.rowHeight = 200;

tambahkan baris kode ini di dalam

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

dan kode terakhir terlihat seperti

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

kode ini akan meningkatkan tinggi sel baris tabel menjadi 200 tinggi default adalah 44

SudhakarH
sumber
-1

Saya memiliki kesalahan yang sama, karena baris ini kesalahan ini ditampilkan.

self.layer.backgroundColor = UIColor (putih: 1, alpha: 0.2) as! CGColor

Saya hanya mengubah baris sebagai berikut untuk memperbaiki kesalahan

self.layer.backgroundColor = UIColor (putih: 1, alpha: 0.2) .cgColor

Malik Hassnain
sumber