Saya menggunakan batasan tata letak otomatis secara terprogram untuk mengatur tata letak sel UITableView kustom saya dan saya menentukan ukuran sel dengan benar di tableView:heightForRowAtIndexPath:
Ini berfungsi dengan baik di iOS6 dan terlihat baik-baik saja di iOS7 juga
TETAPI ketika saya menjalankan aplikasi di iOS7, inilah jenis pesan yang saya lihat di konsol:
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50] (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
"<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
"<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
"<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-| (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>
Dan memang ada salah satu kendala dalam daftar itu yang tidak saya inginkan:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
dan saya tidak dapat mengatur translatesAutoresizingMaskIntoConstraints
properti dari contentView
ke NO => itu akan mengacaukan seluruh sel.
44 adalah tinggi sel default tetapi saya menentukan ketinggian kustom saya dalam delegasi tampilan tabel jadi mengapa sel contentView memiliki batasan ini? Apa yang menyebabkan ini?
Di iOS6 itu tidak terjadi dan semuanya terlihat baik-baik saja di iOS6 dan iOS7.
Kode saya cukup besar jadi saya tidak akan mempostingnya di sini tetapi jangan ragu untuk meminta pastebin jika Anda membutuhkannya.
Untuk menentukan bagaimana saya melakukannya, pada inisialisasi sel:
- Saya membuat semua label, tombol, dll
- Saya menetapkan
translatesAutoresizingMaskIntoConstraints
properti mereka ke NO - Saya menambahkannya sebagai subview dari
contentView
sel - Saya menambahkan batasan pada
contentView
Saya juga sangat tertarik untuk memahami mengapa ini hanya terjadi di iOS7.
Jawaban:
Saya mengalami masalah ini juga .. Tampaknya bingkai contentView tidak diperbarui sampai
layoutSubviews
dipanggil namun bingkai sel diperbarui lebih awal sehingga bingkai contentView disetel{0, 0, 320, 44}
pada saat batasan dievaluasi.Setelah melihat contentView lebih detail, tampaknya autoresizingMasks tidak lagi disetel.
Menyetel autoresizingMask sebelum membatasi tampilan Anda dapat mengatasi masalah ini:
sumber
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
sebelum Anda menambahkan batasan Anda, yang seharusnya menyelesaikan masalah.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
berfungsi sebaik menggunakanself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. Saya memasukkan ini ke dalamupdateConstraints
sebelum menambahkan batasan ke tampilan konten saya.Ternyata ada yang salah dengan UITableViewCell dan UICollectionViewCell di iOS 7 yang menggunakan iOS 8 SDK.
Anda bisa memperbarui contentView sel saat sel digunakan kembali seperti ini:
Untuk Static UITableViewController:
Karena Pengontrol Tampilan Tabel Statis sangat rapuh dan mudah rusak jika Anda menerapkan beberapa sumber data atau metode penghapusan - ada pemeriksaan yang akan memastikan bahwa kode ini hanya akan dikompilasi dan dijalankan di iOS 7
Ini serupa untuk UITableViewController dinamis standar:
Untuk kasus ini kami tidak memerlukan pemeriksaan tambahan kompilasi, karena menerapkan metode ini diperlukan.
Idenya adalah sama untuk kedua kasus dan untuk UICollectionViewCell, seperti yang dikomentari di utas ini: Masalah autoresisasi bingkai UICollectionViewCell contentView dalam sel prototipe Storyboard (Xcode 6, iOS 8 SDK) terjadi saat berjalan di iOS 7 saja
sumber
Karena sel digunakan kembali dan ketinggian dapat berubah berdasarkan konten, saya pikir secara umum akan lebih baik untuk mengatur prioritas jarak kurang dari yang dibutuhkan.
Dalam kasus Anda, UIImageView memiliki jarak 15 ke atas dan tampilan bawah memiliki jarak 0 ke bawah. Jika Anda menyetel prioritas batasan tersebut ke 999 (bukan 1000), aplikasi tidak akan mogok, karena batasan tidak diperlukan.
Setelah metode layoutSubviews dipanggil, sel akan memiliki ketinggian yang benar, dan batasan dapat dipenuhi secara normal.
sumber
Saya masih belum menemukan solusi yang baik untuk storyboard ... Beberapa info juga ada di sini: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
Dari saran mereka di sana:
Saya telah mendorong solusi saya:
.
.
sumber
Tingkatkan saja tinggi sel default. Sepertinya masalahnya adalah konten sel lebih besar dari ukuran sel default (awal), melanggar beberapa batasan non-negatif hingga sel diubah ukurannya ke ukuran sebenarnya.
sumber
UITableViewCellScrollView
) di antara sel tampilan tabel dan tampilan konten; yang mungkin menjelaskan perbedaan antara iOS 6 dan 7 di sini.Mungkin mengatur prioritas tampilan lebih besar dari 750 dan kurang dari 1000 dapat menyelesaikannya.
sumber
Saya memiliki masalah yang sama. Solusi saya berdasarkan yang lain di atas:
Hormat kami, Alessandro
sumber
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
Saya juga menghadapi masalah ini dan tidak ada saran yang membantu. Dalam kasus saya, saya memiliki sel pemilihan ukuran, dan itu berisi collectionView di dalamnya (setiap sel collectionView berisi gambar ukuran penuh). Sekarang, tinggi ukuran sel sedikit lebih besar (60) dari collectionView (50) dan gambar di dalamnya (50). Karena tampilan collectionView tersebut memiliki batasan align bottom to superview dengan nilai 10. Hal itu membuat saya mendapat peringatan, dan satu-satunya cara untuk memperbaikinya adalah dengan membuat ketinggian sel sama dengan collectionView-nya.
sumber
Saya akhirnya tidak menggunakan UITableViewCell di desainer sama sekali ... Saya membuat tampilan kustom di sana dan menambahkannya ke tampilan konten sel secara terprogram ... Dengan beberapa kategori bantuan, juga tidak ada kode boilerplate ...
sumber
Jika berfungsi dengan baik di iOS8, dan mendapatkan peringatan di iOS7, Anda dapat mencari kode sumber storyboard, dan menemukan tableviewCell yang tepat, lalu menambahkan atribut rect setelah baris tableviewCell. Terima kasih kepada kuchumovn .
sumber