Ich habe eine Tag-Leiste in meiner App, die ein UICollectionView
& verwendet UICollectionViewFlowLayout
, wobei eine Reihe von Zellen mittig ausgerichtet ist.
Um den richtigen Einzug zu erhalten, subtrahieren Sie die Gesamtbreite aller Zellen (einschließlich des Abstands) von der Breite Ihrer UICollectionView
und dividieren durch zwei.
[........Collection View.........]
[..Cell..][..Cell..]
[____indent___] / 2
=
[_____][..Cell..][..Cell..][_____]
Das Problem ist diese Funktion -
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
wird vorher aufgerufen ...
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
... Sie können also nicht über Ihre Zellen iterieren, um die Gesamtbreite zu bestimmen.
Stattdessen müssen Sie die Breite jeder Zelle erneut berechnen. In meinem Fall verwende ich sie, [NSString sizeWithFont: ... ]
da meine Zellenbreiten vom UILabel selbst bestimmt werden.
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
CGFloat rightEdge = 0;
CGFloat interItemSpacing = [(UICollectionViewFlowLayout*)collectionViewLayout minimumInteritemSpacing];
for(NSString * tag in _tags)
rightEdge += [tag sizeWithFont:[UIFont systemFontOfSize:14]].width+interItemSpacing;
// To center the inter spacing too
rightEdge -= interSpacing/2;
// Calculate the inset
CGFloat inset = collectionView.frame.size.width-rightEdge;
// Only center align if the inset is greater than 0
// That means that the total width of the cells is less than the width of the collection view and need to be aligned to the center.
// Otherwise let them align left with no indent.
if(inset > 0)
return UIEdgeInsetsMake(0, inset/2, 0, 0);
else
return UIEdgeInsetsMake(0, 0, 0, 0);
}