J'ai un UICollectionView, qui charge les cellules de la cellule réutilisable, qui contient l'étiquette. Un tableau fournit du contenu pour cette étiquette. Je peux facilement redimensionner la largeur de l'étiquette en fonction de la largeur du contenu avec sizeToFit. Mais je ne peux pas faire de cellule pour adapter l'étiquette.
Voici le 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;
}
Réponses:
En
sizeForItemAtIndexPath
retour la taille du textela source
- (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+
Le principe est:
Assurez-vous que la délégation est configurée (par exemple
collectionView.delegate = self
)Implémenter
UICollectionViewDelegateFlowLayout
(il contient la signature de méthode nécessaire).collectionView...sizeForItemAt
Méthode d' appel .Pas besoin de pont coulé
String
àNSString
à l' appelsize(withAttributes:
méthode. Swift l'String
a prêt à l'emploi.Les attributs sont les mêmes que ceux que vous avez définis
(NS)AttributedString
, c'est-à-dire la famille de polices, la taille, le poids, etc. Paramètre facultatif.Exemple de solution:
Mais vous voudrez probablement spécifier des attributs de chaîne concrets respectifs à votre cellule, par conséquent, le retour final ressemblerait à:
Pourquoi vous NE DEVRIEZ PAS utiliser UILabel pour calculer la taille? Voici la solution suggérée:
Oui, vous obtenez le même résultat. Cela semble simpliste et peut sembler une solution incontournable. Mais c'est inapproprié parce que: 1) c'est cher, 2) frais généraux et 3) sale.
C'est cher car UILabel est un objet d'interface utilisateur complexe, qui est créé à chaque itération chaque fois que votre cellule est sur le point de s'afficher, même si vous n'en avez pas besoin ici. C'est une solution de surcharge car vous n'avez besoin que d'obtenir la taille d'un texte, mais vous allez jusqu'à créer un objet d'interface utilisateur complet. Et c'est sale pour cette raison.
la source
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)
J'ai trouvé un petit truc pour swift 4.2
Pour largeur dynamique et hauteur fixe:
Pour hauteur dynamique et largeur fixe:
la source
sizeWithAttributes
, alors peut-être que c'est la réponse préférée.Vérifiez ci-dessous le code que vous pourriez donner à CGSize très court.
la source
Dans Swift 3
la source
Swift 4
la source
// ajouter la vue didload
la source