Swift 5 için güncellendi
preferredLayoutAttributesFittingAttributes
preferredLayoutAttributesFitting
otomatik boyutlandırma olarak yeniden adlandırıldı ve kullan
Swift 4 için güncellendi
systemLayoutSizeFittingSize
olarak yeniden adlandırıldı systemLayoutSizeFitting
İOS 9 için güncellendi
GitHub çözümünün iOS 9 altında kırıldığını gördükten sonra nihayet sorunu tam olarak araştırmak için zaman buldum. Kendini boyutlandırma hücreleri için farklı yapılandırmaların birkaç örneğini içerecek şekilde repo'yu güncelledim. Benim sonucum, kendiliğinden boyutlanan hücrelerin teoride büyük, ancak pratikte dağınık olmasıdır. Kendiliğinden boyutlanan hücrelerle devam ederken dikkat edilmesi gereken bir kelime.
TL; DR
GitHub projeme göz atın
Kendiliğinden boyutlanan hücreler yalnızca akış düzeniyle desteklenir, bu nedenle kullandığınızdan emin olun.
Kendiliğinden boyutlanan hücrelerin çalışması için ayarlamanız gereken iki şey vardır.
1. Set estimatedItemSize
üzerindeUICollectionViewFlowLayout
estimatedItemSize
Özelliği ayarladıktan sonra akış düzeni doğada dinamik hale gelir .
self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
2. Hücre alt sınıfınızda boyutlandırma desteği ekleyin
Bu 2 çeşittir; Otomatik Düzen veya özel geçersiz kılma preferredLayoutAttributesFittingAttributes
.
Otomatik Düzen ile hücre oluşturma ve yapılandırma
Bir hücre için kısıtlamaları yapılandırma hakkında parlak bir SO yazı olduğu için bu konuda ayrıntılı olarak gitmeyeceğim . O Sadece dikkatli olun Xcode 6 kırdı iOS 7 destekleyen eğer iOS 7 öylesine şeyler bir demet, sen autoresizingMask hücrenin sınırları olduğu gibi ayarlanır contentView en sınırları hücrenin contentView üzerinde ve bu ayarlanır sağlamak gibi şeyler yapmanız gerekecektir hücre yüklenir (yani awakeFromNib
).
Dikkat etmeniz gereken şeyler, hücrenizin bir Tablo Görüntüleme Hücresinden daha ciddi şekilde kısıtlanması gerektiğidir. Örneğin, genişliğinizin dinamik olmasını istiyorsanız, hücrenizin bir yükseklik sınırlaması olması gerekir. Benzer şekilde, yüksekliğin dinamik olmasını istiyorsanız, hücreniz için bir genişlik kısıtlamasına ihtiyacınız olacaktır.
Uygulamak preferredLayoutAttributesFittingAttributes
özel hücrede
Bu işlev çağrıldığında, görünümünüz zaten içerikle yapılandırılmıştır (yani cellForItem
çağrılmıştır). Kısıtlamalarınızın uygun şekilde ayarlandığını varsayarsak, bunun gibi bir uygulamaya sahip olabilirsiniz:
//forces the system to do one layout pass
var isHeightCalculated: Bool = false
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
//Exhibit A - We need to cache our calculation to prevent a crash.
if !isHeightCalculated {
setNeedsLayout()
layoutIfNeeded()
let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var newFrame = layoutAttributes.frame
newFrame.size.width = CGFloat(ceilf(Float(size.width)))
layoutAttributes.frame = newFrame
isHeightCalculated = true
}
return layoutAttributes
}
NOT iOS 9'da, dikkatli değilseniz davranış uygulamanızda çökmelere neden olabilecek bir miktar değişti (Daha fazla bilgi için buraya bakın ). Uyguladığınızda preferredLayoutAttributesFittingAttributes
, düzen özelliklerinizin çerçevesini yalnızca bir kez değiştirdiğinizden emin olmanız gerekir. Bunu yapmazsanız, düzen süresiz olarak uygulamanızı çağırır ve sonunda çökecektir. Çözümlerden biri, hücrenizde hesaplanan boyutu önbelleğe almak ve hücreyi yeniden kullandığınızda veya isHeightCalculated
özelliği ile yaptığım gibi içeriğini değiştirdiğinizde bunu geçersiz kılmaktır .
Düzeninizi yaşayın
Bu noktada, collectionView öğenizde 'çalışan' dinamik hücreler olmalıdır. Testlerim sırasında kullanıma hazır çözümü henüz yeterli bulmadım, eğer varsa yorum yapmaktan çekinmeyin. Hala UITableView
dinamik boyutlandırma IMHO için savaşı kazanıyor gibi geliyor .
Uyarılar
TahminiItemSize değerini hesaplamak için prototip hücreler kullanıyorsanız, XIB'niz boyut sınıflarını kullanıyorsa bu durumun kırılacağına dikkat edin . Bunun nedeni, hücrenizi bir XIB'den yüklediğinizde boyut sınıfı ile yapılandırılacaktır Undefined
. Bu yalnızca iOS 8 ve sonraki sürümlerde kesilecektir çünkü iOS 7'de boyut sınıfı cihaza göre yüklenecektir (iPad = Normal-Herhangi, iPhone = Kompakt-Herhangi). XIB'yi yüklemeden tahminiItemSize öğesini ayarlayabilir veya hücreyi XIB'den yükleyebilir, collectionView öğesine ekleyebilir (bu, traitCollection öğesini ayarlar), düzeni gerçekleştirebilir ve ardından denetimden kaldırabilirsiniz. Alternatif olarak, hücrenizi traitCollection
alıcıyı geçersiz kılabilir ve uygun özellikleri döndürebilirsiniz. Sana kalmış.
Bir şey kaçırırsam bana bildirin, yardım ettim ve iyi şanslar kodlama