Tôi có một thanh thẻ trong ứng dụng của mình sử dụng UICollectionView
&UICollectionViewFlowLayout
, với một hàng ô được căn giữa.
Để có được thụt lề chính xác, bạn lấy chiều rộng của ô trừ đi tổng chiều rộng của tất cả các ô (bao gồm cả khoảng cách) UICollectionView
và chia cho hai.
[........Collection View.........]
[..Cell..][..Cell..]
[____indent___] / 2
=
[_____][..Cell..][..Cell..][_____]
Vấn đề là chức năng này -
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
được gọi trước ...
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
... vì vậy bạn không thể lặp lại các ô của mình để xác định tổng chiều rộng.
Thay vào đó, bạn cần phải tính toán lại chiều rộng của từng ô, trong trường hợp của tôi, tôi sử dụng [NSString sizeWithFont: ... ]
vì chiều rộng ô của tôi được xác định bởi chính Nhãn UIL.
- (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);
}