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
Der Text in der Zelle ist in einem UILabel? (Haben Sie die maximale Anzahl an Zeilen eingestellt?) – valR
ich setze es auf 0, damit es so viel wie nötig haben kann –
Die Breite beeinflusst ganz offensichtlich die Höhe, weil die Breite bestimmt, ob Sie eine, zwei, drei oder mehr Zeilen haben von Text. – gnasher729