Ich habe eine UICollectionView, die Zellen aus wiederverwendbaren Zellen lädt, die Label enthalten. Ein Array bietet Inhalt für dieses Label. Mit sizeToFit kann ich die Größe der Etikettenbreite je nach Inhaltsbreite problemlos ändern. Aber ich kann die Zelle nicht passend zum Etikett machen.
Hier ist der Code
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
arrayOfStats = @[@"time:",@"2",@"items:",@"10",@"difficulty:",@"hard",@"category:",@"main"];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section{
return [arrayOfStats count];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return CGSizeMake(??????????);
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
Cell *cell = (Cell *) [collectionView dequeueReusableCellWithReuseIdentifier:@"qw" forIndexPath:indexPath];
cell.myLabel.text = [NSString stringWithFormat:@"%@",[arrayOfStats objectAtIndex:indexPath.item]];
// make label width depend on text width
[cell.myLabel sizeToFit];
//get the width and height of the label (CGSize contains two parameters: width and height)
CGSize labelSize = cell.myLbale.frame.size;
NSLog(@"\n width = %f height = %f", labelSize.width,labelSize.height);
return cell;
}
ios
objective-c
swift
uicollectionview
uicollectionviewcell
Fruchtfleisch
quelle
quelle
Antworten:
Im
sizeForItemAtIndexPath
Gegenzug die Größe des Textesquelle
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ Cell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"qw" forIndexPath:indexPath]; cell.myLbale.text = [NSString stringWithFormat:@"%@",[arrayOfStats objectAtIndex:indexPath.item]]; CGSize textSize; textSize = [[arrayOfStats objectAtIndex:indexPath.item] sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f]}]; [cell.myLbale sizeThatFits:textSize]; //[cell.myLbale sizeToFit]; return cell; }
Swift 4.2+
Prinzip ist:
Stellen Sie sicher , dass eine Delegation eingerichtet ist (zB
collectionView.delegate = self
)Implementieren
UICollectionViewDelegateFlowLayout
(es enthält die erforderliche Methodensignatur).collectionView...sizeForItemAt
Methode aufrufen .Keine Notwendigkeit, Brücke Guss
String
auf ,NSString
um diesize(withAttributes:
Anrufmethode. SwiftString
hat es aus der Box.Die Attribute sind die gleichen, für die Sie festgelegt haben, z
(NS)AttributedString
. B. Schriftfamilie, Größe, Gewicht usw. Optionaler Parameter.Probenlösung:
Sie möchten jedoch höchstwahrscheinlich konkrete Zeichenfolgenattribute für Ihre Zelle angeben, sodass die endgültige Rückgabe folgendermaßen aussehen würde:
Warum sollten Sie UILabel NICHT verwenden, um die Größe zu berechnen? Hier ist die vorgeschlagene Lösung:
Ja, Sie erhalten das gleiche Ergebnis. Es sieht simpel aus und scheint eine gute Lösung zu sein. Aber es ist unangemessen, weil: 1) es teuer ist, 2) Overhead und 3) schmutzig.
Es ist teuer, weil UILabel ein komplexes UI-Objekt ist, das bei jeder Iteration erstellt wird, wenn Ihre Zelle angezeigt wird, obwohl Sie es hier nicht benötigen. Dies ist eine Overhead-Lösung, da Sie nur die Größe eines Textes ermitteln müssen, aber sogar ein ganzes UI-Objekt erstellen müssen. Und aus diesem Grund ist es schmutzig.
quelle
collectionView.delegate == self // or whatever-object-which-do-it
CGSize(width: title.size(withAttributes: [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 16)]).width + 5, height: 50)
Ich habe einen kleinen Trick für Swift 4.2 gefunden
Für dynamische Breite und feste Höhe:
Für dynamische Höhe und feste Breite:
quelle
sizeWithAttributes
. Vielleicht ist dies die bevorzugte Antwort.Kasse unter dem Code, den Sie möglicherweise sehr kurz CGSize geben.
quelle
In Swift 3
quelle
Swift 4
quelle
// In der Ansicht Didload hinzufügen
quelle