我正在讨论来自https://github.com/hebertialmeida/HAPaperViewController和https://github.com/wtmoose/TLLayoutTransitioning的示例项目的CollectionViewLayout的转换,并且无法弄清楚如何在小型和大型布局之间自动调整单元格的内容
E.g。我在CollectionViewCell中有一个UILabel,它应该是定义(固定)位置的单元格宽度的一半。完成到大布局的转换后,标签也应该是单元格的一半(相同的相对位置),但字体大小(或调整大小)。
在此处使用autolayout或使用CGAffineTransformMakeScale缩放contentView?
答案 0 :(得分:3)
我已更新TLLayoutTransitioning中的“调整大小”示例项目,以演示如何完成此操作。
该方法涉及使用TLLayoutTransitioning回调之一在转换的每个步骤更新字体大小。你可能不想使用仿射变换,因为你会得到大尺寸的模糊缩放文本。
第一步是定义一个设置标签字体大小的方法。你可以使用你喜欢的任何公式,但我已经按照单元格的宽度按比例缩放字体:
- (void)updateLabelScale:(UILabel *)label cellSize:(CGSize)cellSize
{
CGFloat pointSize = cellSize.width * 17 / 128.f;
label.font = [UIFont fontWithName:label.font.fontName size:pointSize];
}
您需要在cellForItemAtIndexPath
中调用此方法,以确保屏幕上显示的新标签得到正确缩放:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath];
UILabel *label = (UILabel *)[cell viewWithTag:1];
...
[self updateLabelScale:label cellSize:cell.bounds.size];
return cell;
}
标签的中心被约束到单元格的中心,大小由intrinsicContentSize
决定。因此,当您更改字体时,标签的大小将自动调整为适合。
最后,您将使用updateLayoutAttributes
回调根据新的布局属性更新可见单元格的字体大小(您无需担心因为您正在使用而无法看到的单元格关注cellForRowAtIndexPath
):
__weak ResizeCollectionViewController *weakSelf = self;
[layout setUpdateLayoutAttributes:^UICollectionViewLayoutAttributes *(UICollectionViewLayoutAttributes *pose, UICollectionViewLayoutAttributes *fromPose, UICollectionViewLayoutAttributes *toPose, CGFloat progress) {
CGSize cellSize = pose.bounds.size;
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:pose.indexPath];
if (cell) {
UILabel *label = (UILabel *)[cell viewWithTag:1];
[weakSelf updateLabelScale:label cellSize:cellSize];
}
return nil;
}];