Saya menggunakan Xcode 6 Beta 3, iOS 8 SDK. Bangun Target iOS 7.0 menggunakan Swift. Silakan merujuk masalah saya selangkah demi selangkah dengan tangkapan layar di bawah ini.
Saya memiliki UICollectionView di Storyboard. 1 Prototipe UICollectionViewCell yang berisi 1 label di tengah (tidak ada aturan autoresizing). Latar belakang ungu adalah untuk menandai contentView yang dihasilkan dalam runtime oleh Cell kurasa. Pandangan itu akan diubah ukurannya dengan benar berdasarkan pada UICollectionViewLayoutDelegate saya pada akhirnya, tetapi tidak pada iOS 7. Perhatikan bahwa saya menggunakan Xcode 6 dan masalahnya hanya terjadi pada iOS 7.
Ketika saya membangun aplikasi di iOS 8. Semuanya baik-baik saja.
Catatan: Ungu adalah contentView , Biru adalah UIButton saya dengan sudut bulat.
Namun, pada iOS 7, semua subViews di dalam Cell tiba-tiba menyusut ke bingkai (0,0,50,50) dan tidak pernah lagi mematuhi aturan Autoresizing saya lagi.
Saya berasumsi ini adalah bug di iOS 8 SDK atau Swift atau mungkin Xcode?
Pembaruan 1: Masalah ini masih ada di Xcode 6.0.1 resmi! Pekerjaan terbaik di sekitar adalah seperti apa yang disarankan KoCMoHaBTa di bawah ini dengan mengatur bingkai di cellForItem sel (Anda harus subkelas sel Anda). Ternyata ini adalah ketidakcocokan antara iOS 8 SDK dan iOS 7 (lihat jawaban ecotax di bawah yang dikutip dari Apple).
Pembaruan 2: Tempel kode ini di awal cellForItem Anda dan semuanya akan baik-baik saja:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
contentView
mengubah ukuran dengan sel berfungsi dengan baik untuk menyelesaikan masalah. Saya kira di iOS 8 Apple mengubah sesuatu tentang cara tampilan konten sel ditangani ketika dibuat di Interface Builder (yang masih sedikit kotak hitam). Tetapi fakta bahwa itu mengubah perilaku ketika menargetkan iOS 7 pasti bug.contentView
tepi ke tepi sel.Jawaban:
contentView rusak. Itu juga bisa diperbaiki di awakeFromNib
ObjC:
Swift3:
sumber
Saya mengalami masalah yang sama dan meminta bantuan Apple DTS. Jawaban mereka adalah:
Saya kira ini berarti itu bukan bug di XCode 6, tetapi ketidakcocokan antara iOS 8 SDK dan iOS 7 SDK, yang akan mengenai Anda jika Anda memutakhirkan ke Xcode 6, karena ia akan secara otomatis mulai menggunakan iOS 8 SDK.
Seperti yang saya komentari sebelumnya, solusi Daniel Plamann menjelaskan pekerjaan untuk saya. Yang dijelaskan oleh Igor Palaguta dan KoCMoHaBTa terlihat lebih sederhana, dan tampaknya masuk akal memberikan jawaban Apple DTS, jadi saya akan mencobanya nanti.
sumber
Saya mengalami masalah yang sama dan berharap Apple akan memperbaikinya dengan versi Xcode berikutnya. Sementara itu saya menggunakan solusi. Di
UICollectionViewCell
subkelas saya, saya baru saja menggantilayoutSubviews
dan mengubah ukuran contentView secara manual jika ukurannya berbeda daricollectionViewCell
ukuran.sumber
[cell layoutIfNeeded];
di cellForItem atau cellForRow?Solusi lain adalah dengan mengatur ukuran contentView dan masker autoresizing
-collectionView:cellForItemAtIndexPath:
seperti berikut:Ini berfungsi dengan Tata Letak Otomatis juga, karena topeng pengubah ukuran otomatis diterjemahkan ke kendala.
sumber
Dalam Xcode 6.0.1 contentView untuk UICollectionViewCell rusak untuk perangkat iOS7. Itu juga dapat diperbaiki dengan menambahkan batasan yang tepat untuk UICollectionViewCell dan kontennya di awakeFromNib atau metode init.
sumber
Ini tidak akan berfungsi dengan benar tanpa ada solusi lain yang disebutkan karena bug di Xcode 6 GM dengan cara Xcode mengkompilasi file xib ke dalam format nib. Walaupun saya tidak bisa mengatakan untuk kepastian 100% bahwa ini terkait dengan Xcode dan tidak ada hubungannya dengan runtime, saya sangat yakin - inilah cara saya dapat menunjukkannya:
Saya harap semua orang yang membaca pertanyaan ini akan mengajukan Radar dengan Apple. Ini adalah masalah BESAR dan perlu ditangani sebelum rilis Xcode akhir.
Sunting: Sehubungan dengan posting ecotax , saya hanya ingin memperbarui ini untuk mengatakan bahwa sekarang dikonfirmasi perbedaan perilaku antara membangun di iOS 8 vs iOS 7, tetapi bukan bug. Peretasan saya memperbaiki masalah ini karena membangun di iOS 7 menambahkan masker autoresizing ke tampilan konten yang diperlukan untuk membuat ini berfungsi, yang tidak lagi ditambahkan oleh Apple.
sumber
Jawaban di postingan ini berfungsi, apa yang saya tidak pernah mengerti adalah mengapa ini berhasil.
Pertama, ada dua "aturan":
[UIView new]
), PropertitranslatesAutoresizingMaskIntoConstraints
disetel keYES
translatesAutoresizingMaskIntoConstraints
disetel keNO
Aturan kedua tampaknya tidak berlaku untuk tampilan tingkat atas yang Anda tidak mendefinisikan batasannya. (Mis. Tampilan konten)
Saat melihat sel Storyboard, perhatikan bahwa selnya tidak
contentView
terbuka. Kami tidak "mengendalikan"contentView
, Apple.Selami lebih dalam kode sumber storyboard dan lihat bagaimana
contentView
sel didefinisikan:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Sekarang subview sel (perhatikan
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
The
contentView
tidak memiliki itutranslatesAutoresizingMaskIntoConstraints
diatur untukNO
. Plus itu tidak memiliki definisi tata letak, mungkin karena apa yang dikatakan @ecotax .Jika kita melihat ke dalam
contentView
, itu memang memiliki topeng autoresizing, tetapi tidak ada definisi untuk itu:<autoresizingMask key="autoresizingMask"/>
Jadi ada dua kesimpulan:
contentView
translatesAutoresizingMaskIntoConstraints
diatur keYES
.contentView
tidak memiliki definisi tata letak.Ini membawa kita ke dua solusi yang telah dibicarakan.
Anda dapat mengatur masker autoresizing secara manual di
awakeFromNib
:Atau Anda dapat mengatur
contentView
translatesAutoresizingMaskIntoConstraints
untukNO
masukawakeFromNib
dan mendefinisikan kendala di- (void)updateConstraints
.sumber
Ini adalah versi Swift dari jawaban Igor yang diterima dan terima kasih atas jawaban Anda yang baik.
Pertama-tama, ambil
UICollectionViewCell
Subclass Anda dan rekatkan kode berikut karena berada di dalam kelas.Omong-omong saya menggunakan Xcode 7.3.1 dan Swift 2.3. Solusi diuji pada iOS 9.3 yang berfungsi dengan sempurna.
Terima kasih, semoga ini membantu.
sumber
Di cepat, tempatkan kode berikut dalam subkelas sel tampilan kumpulan:
sumber
Saya telah menemukan bahwa ada juga masalah dengan
contentView
ukuran di iOS 8. Itu cenderung ditata sangat terlambat dalam siklus, yang dapat menyebabkan konflik kendala sementara. Untuk mengatasi ini, saya menambahkan metode berikut dalam kategoriUICollectionViewCell
:Metode ini harus dipanggil setelah mengeluarkan sel.
sumber
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Saya tetap melakukan ini:
lihat di sini
sumber
Pastikan Anda mencentang kotak "Autoresize subviews" di nib untuk sel tampilan koleksi. Ini akan berfungsi dengan baik di iOS 8 dan iOS 7.
sumber