2017-07-22 4 views
0

Ich versuche, eine CollectionView mit einer einzigen Spalte (Art der Tabellenansicht Stil) mit Zelle mit dynamischer Höhe zu erstellen. Jede Zelle enthält eine Draufsicht, die eine Höhe von 50 Punkten hat und für die Zelle führende, nacheilende und obere Beschränkungen aufweist. und die einzige andere Sache ist ein Text darunter, der je nach Inhalt eine dynamische Höhe haben wird. Das Problem ist, dass ich versucht habe, die boundingRect-Methode zu verwenden, um die Größe für das Label zu berechnen, aber wenn der Text zu lang ist, wird er abgeschnitten (abgeschnitten) und die Zelle ist nicht so groß wie sie sollte. dies ist mein Code:Berechnen von NSString Höhe zur Verwendung in collectionView Zellen

extension CustomCollectionViewController: UICollectionViewDelegateFlowLayout{ 
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let collectionViewWidth = collectionView.bounds.width 
    let topViewHeight: CGFloat = 50 
    let topAndBottomMargin: CGFloat = 8 
    let width = collectionViewWidth - 4 * 2 
    let text = answer[indexPath.item] 

    let s = NSString(string: "hello") 
    let font = UIFont.systemFont(ofSize: 15) 
    let height = calculateTextHeight(for: text, font: font, width: width - 100) 

    return CGSize(width: width, height: height + topViewHeight + topAndBottomMargin + 16) 

} 

func calculateTextHeight(for text: String, font:UIFont, width: CGFloat) -> CGFloat{ 
    let attributes = [NSFontAttributeName: font] 
    let estimateHeight = NSString(string: text).boundingRect(with: CGSize(width: width, height: .greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: attributes, context: nil) 
    let string = NSString(string: text) 

    //let estimateHeight = string.size(attributes: [NSFontAttributeName: font]) 
    print(estimateHeight.height) 
    return CGFloat(ceil(estimateHeight.height)) 


} 

zweite Sache ist, ich verstehe nicht, noch ist, dass wie funktioniert die Breite in CGSize die Gesamthöhe auswirken?

ich versuchte mit NSString.size, aber das funktioniert überhaupt nicht. Es unterschatzt die Höhe der Zeichenfolge

+0

Der Text in der Zelle ist in einem UILabel? (Haben Sie die maximale Anzahl an Zeilen eingestellt?) – valR

+0

ich setze es auf 0, damit es so viel wie nötig haben kann –

+0

Die Breite beeinflusst ganz offensichtlich die Höhe, weil die Breite bestimmt, ob Sie eine, zwei, drei oder mehr Zeilen haben von Text. – gnasher729

Antwort

0

Der LayoutManager wird den Layout-Delegaten aufrufen, um die Elementgröße (die Sie implementiert), aber es wird nur einmal und nach dieser Größe im Cache als LayoutAttribute (UICollectionViewLayoutAttributes).

Also vielleicht in Ihrem Fall verwendet es eine alte Größe (im Cache) und Ihre Sammlung Ansicht wurde in der Größe verändert?

So eine der Sache zu tun, ist richtig, die Layout-Cache zurückgesetzt, wenn die Sammlung Ansicht gebunden Änderung (wahrscheinlich in viewWillAppear und willTransition?) In diesem Fall etwas tun:

let context = UICollectionViewFlowLayoutInvalidationContext() 
context.invalidateFlowLayoutAttributes = true 
context.invalidateFlowLayoutDelegateMetrics = true 
self.collectionView.collectionViewLayout.invalidateLayout(with: context) 

von Dadurch löscht das Layout den Cache und fragt Sie nach der korrekten Breite Ihres Artikels mit einer aktuellen Breite. Wenn Sie jedes Element auf die maximale Breite einstellen, haben Sie eine Spalte

maxWidth = collectionView.bounds.width - layout.sectionInset.left - layout.sectionInset.right 
Verwandte Themen