Eu tenho um UICollectionView, que carrega células de células reutilizáveis, que contém rótulo. Uma matriz fornece conteúdo para esse rótulo. Posso redimensionar a largura da etiqueta dependendo da largura do conteúdo facilmente com sizeToFit. Mas não posso fazer célula para caber na etiqueta.
Aqui está o código
- (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;
}
Respostas:
Em
sizeForItemAtIndexPath
troca o tamanho do textofonte
- (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+
O princípio é:
Certifique-se de que a delegação esteja configurada (por exemplo
collectionView.delegate = self
)Implementar
UICollectionViewDelegateFlowLayout
(contém a assinatura do método necessária).collectionView...sizeForItemAt
Método de chamada .Não há necessidade de ponte-cast
String
paraNSString
a chamadasize(withAttributes:
de método. SwiftString
já vem pronto para uso.Os atributos são os mesmos que você definiu
(NS)AttributedString
, ou seja, família da fonte, tamanho, peso, etc. Parâmetro opcional.Solução de amostra:
Mas você provavelmente desejaria especificar atributos de string concretos respectivos para sua célula, portanto, o retorno final seria semelhante a:
Por que você NÃO DEVE usar UILabel para calcular o tamanho? Esta é a solução sugerida:
Sim, você obtém o mesmo resultado. Parece simplista e pode parecer uma solução ideal. Mas é impróprio porque: 1) é caro, 2) sobrecarregado e 3) sujo.
É caro porque UILabel é um objeto de IU complexo, que está sendo criado a cada iteração sempre que sua célula está prestes a ser exibida, mesmo que você não precise dela aqui. É uma solução de overhead porque você só precisa obter o tamanho de um texto, mas vai tão longe a ponto de criar um objeto de IU inteiro. E é sujo por esse motivo.
fonte
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)
Eu encontrei um pequeno truque para o Swift 4.2
Para largura dinâmica e altura fixa:
Para altura dinâmica e largura fixa:
fonte
sizeWithAttributes
, então talvez essa seja a resposta preferida.Verifique abaixo o código que você pode estar fornecendo CGSize muito curto.
fonte
Em Swift 3
fonte
Swift 4
fonte
// adicionar à vista didload
fonte